卡特兰数简单应用
f[n+1]=(4*n+2)/(n+2)*f[n];
由f[n]=C(n,2n)-C(n+1,2n)推导
然后就是一些大数乘法和大数除法了。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> #include <math.h> #include <map> #include <queue> #include <sstream> #include <iostream> using namespace std; #define INF 0x3fffffff #define base 10000 int g[110][110]; void mmul(int s[],int tmp,int t[]) { for(int i=0;i<100;i++) { t[i]=s[i]*tmp; } for(int i=0;i<100;i++) { t[i+1]+=t[i]/base; t[i]%=base; } } void mdiv(int s[],int tmp) { int d; for(int i=100;i>=0;i--) { d=s[i]%tmp; s[i]=s[i]/tmp; if(i!=0) s[i-1] += d*base; } } int main() { //freopen("//home//chen//Desktop//ACM//in.text","r",stdin); //freopen("//home//chen//Desktop//ACM//out.text","w",stdout); int n; g[1][0]=1; for(int i=2;i<=100;i++) { int up=4*(i-1)+2; mmul(g[i-1],up,g[i]); int down=i+1; mdiv(g[i],down); //mmul(g[i],i,g[i]); 这一步看要不要阶层 } while(scanf("%d",&n)&&n) { int i; for(i=100;i>=0;i--) if(g[n][i]!=0) break; printf("%d",g[n][i]); i--; for(;i>=0;i--) printf("%04d",g[n][i]); printf("\n"); } return 0; }