http://acm.hdu.edu.cn/showproblem.php?pid=2446

來源:互聯網
上載者:User

/*<br /> * 很水的一個題目,為何給我弄得最後才AC<br /> * 自責ing<br /> * 1 + 1 + 2 + 1 + 2 + 3 + .... = n(n + 1)(n + 2) / 6;<br /> * 二分找最小的n 滿足n(n + 1)(n + 2) / 6 >= yy<br /> * 在二分找r(r + 1)/2 <= xx<br /> * 在最大r<br /> * 原來是long 相乘的時候益處了,一直以為是自己的代碼寫錯了<br /> * zhc說的對,用了BigInteger 幹嘛要用long<br /> * 好好練習下java,他們兩個都不會的<br /> */<br />import java.util.*;<br />import java.io.*;<br />import java.math.*;<br />public class Main {<br /> public static void main(String[] args) {<br /> Scanner cin = new Scanner(System.in);<br /> int t;<br /> t = cin.nextInt();<br /> while (t-- > 0) {<br /> // BigInteger n;<br /> // n = cin.nextBigInteger();<br /> long n;<br /> n = cin.nextLong();<br /> long lay = Bin(n);<br /> System.out.print(lay + " ");<br /> BigInteger a1 = BigInteger.valueOf(lay - 1);<br /> BigInteger a2 = BigInteger.valueOf(lay);<br /> BigInteger a3 = BigInteger.valueOf(lay + 1);<br /> BigInteger two = BigInteger.valueOf(2);<br /> BigInteger six = BigInteger.valueOf(6);<br /> BigInteger ans = a1.multiply(a2).multiply(a3).divide(six);</p><p> BigInteger nn = BigInteger.valueOf(n);<br /> nn = nn.subtract(ans);<br /> long r = Bin2(nn);<br /> //if(r * (r + 1) / 2 == nn.longValue())<br /> //r -= 1;<br /> BigInteger rr = BigInteger.valueOf(r);<br /> if(rr.multiply(rr.add(BigInteger.ONE)).divide(two).compareTo(nn) == 0)<br /> r -= 1;<br /> ans = nn.subtract(BigInteger.valueOf(r).multiply(BigInteger.valueOf(r + 1)).divide(two));<br /> r += 1;<br /> System.out.println(r + " " + ans);<br /> }<br /> }</p><p> static long Bin2(BigInteger n) {<br /> BigInteger num = n;<br /> BigInteger two = BigInteger.valueOf(2);<br /> long low = 1;<br /> long high = n.longValue();<br /> long ans = 0;<br /> while (low <= high) {<br /> long mid = (low + high) / 2;<br /> BigInteger a1 = BigInteger.valueOf(mid);<br /> BigInteger a2 = BigInteger.valueOf(mid + 1);<br /> BigInteger sum = a1.multiply(a2);<br /> if (sum.compareTo(num.multiply(two)) == 0) {<br /> return mid;<br /> } else if(sum.compareTo(num.multiply(two)) == -1){<br /> ans = mid ;<br /> low = mid + 1;<br /> } else {<br /> high = mid - 1;<br /> }<br /> }<br /> return ans;<br /> }<br /> static long Bin(long n) {<br /> BigInteger num = BigInteger.valueOf(n);<br /> BigInteger six = BigInteger.valueOf(6);<br /> long low = 1;<br /> long high = (long) Math.sqrt(1.0 * n) + 1;<br /> long ans = 0;<br /> while (low <= high) {<br /> long mid = (low + high) / 2;<br /> BigInteger a1 = BigInteger.valueOf(mid);<br /> BigInteger a2 = BigInteger.valueOf(mid + 1);<br /> BigInteger a3 = BigInteger.valueOf(mid + 2);<br /> BigInteger sum = a1.multiply(a2).multiply(a3);<br /> if (sum.compareTo(num.multiply(six)) == 0) {<br /> //ans = mid;<br /> //high = mid - 1;<br /> return mid;<br /> } else if(sum.compareTo(num.multiply(six)) == 1){<br /> ans = mid ;<br /> high = mid - 1;<br /> } else {<br /> low = mid + 1;<br /> }<br /> }<br /> return ans;<br /> }<br />}<br /> 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.