题目不是很难,关键是数值很大会爆值,如果用c++写需要手写大数加减乘除法(我太菜了),非常的麻烦,就找java同学使用api BigInteger来进行大数运算,具体思路就是累计求和,看看代码就理解了,下面给出代码。
import java.math.BigInteger;
import java.util.Scanner;
public class QuickSort {
static BigInteger[][] sum = new BigInteger[1005][2];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int temp = sc.nextInt();
BigInteger up;
BigInteger down;
sum[2][0] = BigInteger.valueOf(1);
sum[2][1] = BigInteger.valueOf(1);
BigInteger a1;
BigInteger b1;
BigInteger c1;
BigInteger k1;
BigInteger k2;
BigInteger x;
for (int i = 3; i < 1002; i++) {
//i = 3 是记录前3个T(k)的和,先计算出T(3);
up = sum[i - 1][0].multiply(BigInteger.valueOf(2));
down = sum[i - 1][1].multiply(BigInteger.valueOf(i));
up = up.add(down.multiply(BigInteger.valueOf((i - 1))));
x = up.gcd(down);
up = up.divide(x);
down = down.divide(x);
a1 = up.divide(down);
b1 = up.mod(down);
c1 = down;
/*cout << i << endl;*/
if (i == temp) {
System.out.println(a1 + " " + b1 + " " + c1);
break;
}
k1 = (sum[i - 1][0].multiply(down)).add(up.multiply(sum[i - 1][1]));
k2 = sum[i - 1][1].multiply(down);
x = k1.gcd(k2);
sum[i][0] = k1.divide(x);
sum[i][1] = k2.divide(x);
}
}
}