题意 :在平面坐标系的第一象限上,从原点出发,到 (n, 0) 的种类。
思路 : 卡塔兰数。c[n] = 2n! / ((n+1)! n!) = c(2n, n) / (n + 1)
因为始点与终点是水平的。 所以向上多少,向下就要多少,其余的都是水平前景的。
假设 上升了 k 次 那就必须下降 k 次 所以 a[k] = c(n, 2k) * c(2k, k) / (k + 1);
k 是从 0 变化到 n / 2的;
那么sum[n] = a[0] + a[1] + a[2] + ……+ a[k] (k <= n/2); 且a[0] = 1;(只有一个水平的).
但是如果对于每个 a[k] 都用阶乘是会超时的。
所以用数列公司 a[k] = c(n, 2k) * c(2k, k) / (k + 1) 与 a[k - 1] = c(n, 2k - 2) * c(2k - 2, k - 1) / k递推出
a[k] = a[k-1] * (n - 2 * k + 1) * (n - 2 * k + 2) / (k * (k + 1));
把上升看成1,下降看成-1,并且1的数量对-1保持优势
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner read = new Scanner(System.in);
BigInteger mod = BigInteger.TEN.pow(100);
BigInteger sum = new BigInteger("0");
BigInteger t = new BigInteger("0");
while (read.hasNext()) {
int n = read.nextInt();
sum = BigInteger.ONE;
t = BigInteger.ONE;
for(int k = 1; k + k <= n; k++) {
t = t.multiply(BigInteger.valueOf((n-2*k+1)*(n-2*k+2))) .divide(BigInteger.valueOf(k*(k+1)));
System.out.println(t);
sum = sum.add(t);
}
System.out.println(sum.mod(mod));
}
}
}