/*<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 />