很多组合题都会用到卡特兰数,增长速度又很快,应该写个高精度尊敬一下~
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define ML 549 5 using namespace std; 6 int kt[105][550]; 7 int len[105]; 8 int getlen(int ord) 9 { 10 int pos; 11 for(int i=ML;i>=0;i--) 12 if(kt[ord][i]!=0) 13 { 14 pos=i; 15 break; 16 } 17 return pos+1; 18 } 19 void mut(int ord) 20 { 21 for(int i=0;i<len[ord-1];i++) 22 kt[ord][i]=kt[ord-1][i]*(4*ord-2); 23 for(int i=0;i<ML;i++) 24 if(kt[ord][i]>9) 25 kt[ord][i+1]+=kt[ord][i]/10,kt[ord][i]%=10; 26 len[ord]=getlen(ord); 27 } 28 void div(int ord) 29 { 30 int k=ord+1; 31 for(int i=len[ord]-1;i>=0;i--) 32 { 33 if(i!=0) 34 kt[ord][i-1]+=(kt[ord][i]%k)*10; 35 kt[ord][i]/=k; 36 } 37 len[ord]=getlen(ord); 38 } 39 void ini() 40 { 41 memset(kt,0,sizeof(kt)); 42 kt[1][0]=1; 43 len[1]=1; 44 for(int i=2;i<=100;i++) 45 { 46 mut(i); 47 div(i); 48 } 49 } 50 void print(int ord) 51 { 52 for(int i=len[ord]-1;i>=0;i--) 53 printf("%d",kt[ord][i]); 54 printf("\n"); 55 } 56 int main() 57 { 58 int n; 59 ini(); 60 while(scanf("%d",&n)) 61 { 62 if(n==-1) break; 63 else print(n); 64 } 65 return 0; 66 }