之前做过一道卡特兰数的题目。但那个题目比较直接,很容易看出是卡特兰数。但这道题目需要自己去观察。
对卡特兰数的了解不要仅仅局限在它的公式上,还要去了解它的各种应用。其中有一个栈的应用:就是说给一个1-n的数列,求其入栈出栈后序列的个数。上图中,如果我们把横线去掉,就是斜线往上往下。我们把斜线往上看做入栈,往下看做出栈,就和卡特兰数栈的应用一样。而其余横线我们可以随便插入,就是一个组合数。想到这里,我们就可以枚举斜线上下的个数(斜线上下个数相同),累加起来便是答案。
F[n] = ∑T(k) + ∑C(k)*Con(2*k, n), 其中0<=2 * k<=n, C(k)是卡特兰数,Con(m, m)是组合数。但是n为100000,直接求Con(m, n)也求不出。所以我们化简T(k)/T(k-1),得:T(k) = T(k - 1) * (k - )
这样可以再O(n)的时间内求出F[n],最后模10的100次方,便是答案。
import java.io.*;
import java.math.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n;
BigInteger M = BigInteger.TEN.pow(100);
while(cin.hasNext()){
n = cin.nextInt();
BigInteger ans = BigInteger.ONE, v = BigInteger.ONE;
for(int i = 1; i * 2 <= n; i++){
v = v.multiply(BigInteger.valueOf(n - 2 * i + 1)).multiply(BigInteger.valueOf(n - 2 * i + 2)).divide(BigInteger.valueOf(i)).divide(BigInteger.valueOf(i + 1));
ans = ans.add(v);
}
System.out.println(ans.mod(M));
}
}
}