Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 460 Accepted Submission(s): 223
#include<stdio.h> #include<math.h> #include<algorithm> using namespace std; int main() { int T; scanf("%d",&T); long long a; while(T--) { scanf("%I64d",&a); double temp=ceil((1+sqrt(1+4*a))/2)-1; long long n=(long long)temp; long long res1=n+a; long long res2=n*(n+1)*(2*n+1)/3-3*(n+1)*n/2+n+(n+a-n*n+1)*n; printf("%I64d %I64d\n",res1,res2); } return 0; }
一开始以为要用高精度,就用JAVA写了个高精度的,也贴个代码吧:
import java.util.*; import java.math.*; import java.io.*; public class Main { public static void main(String[] args) { int T; Scanner cin=new Scanner(new BufferedInputStream(System.in)); T=cin.nextInt(); double a; for(int i=0;i<T;i++) { a=cin.nextDouble(); double n=Math.ceil((1+Math.sqrt(4*a+1))/2)-1; int res1=(int)(n+a); BigInteger res2=BigInteger.valueOf(0); BigInteger t1=BigInteger.valueOf(1); t1=t1.multiply(BigInteger.valueOf((int)n)); t1=t1.multiply(BigInteger.valueOf((int)(n+1))); t1=t1.multiply(BigInteger.valueOf((int)(2*n+1))); t1=t1.divide(BigInteger.valueOf(3)); BigInteger t2=BigInteger.valueOf(1); t2=t2.multiply(BigInteger.valueOf((int)n)); t2=t2.multiply(BigInteger.valueOf((int)(n+1))); t2=t2.multiply(BigInteger.valueOf(3)); t2=t2.divide(BigInteger.valueOf(2)); BigInteger t3=BigInteger.valueOf(0); t3=t3.add(BigInteger.valueOf((int)(n+a-n*n+1))); t3=t3.multiply(BigInteger.valueOf((int)n)); t3=t3.add(BigInteger.valueOf((int)n)); res2=res2.add(t1); res2=res2.subtract(t2); res2=res2.add(t3); //System.out.println(t1+" "+t2+" "+t3); System.out.println(res1+" "+res2); } } }