标签:
1 2 3 10
1 2 5 16796HintThe result will be very large, so you may not process it by 32-bit integers.
代码:
/* 原理: 令h(0)=1,h(1)=1,catalan数满足递推式[1] : h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2) 例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2 h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5 另类递推式[2] : h(n)=h(n-1)*(4*n-2)/(n+1); 递推关系的解为: h(n)=C(2n,n)/(n+1) (n=0,1,2,...) 递推关系的另类解为: h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...) */
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[110][110]={0};//二维数组a[输入的n][n的卡特兰数的每一位的值]; int b[110];//记录位数; void catalan()//求卡特兰数; { int i,j,len,carry,temp; a[1][0]=b[1]=1; len=1; for(i=2;i<=100;i++) { for(j=0;j<len;j++)//乘法; { a[i][j]=a[i-1][j]*(4*(i-1)+2); } carry=0; for(j=0;j<len;j++)//处理相乘结果; { temp=a[i][j]+carry; a[i][j]=temp%10; carry=temp/10; } while(carry)//进位处理; { a[i][len++]=carry%10; carry/=10; } carry=0; for(j=len-1;j>=0;j--)//除法; { temp=carry*10+a[i][j]; a[i][j]=temp/(i+1); carry=temp%(i+1); } while(!a[i][len-1])//高位零处理; { len--; } b[i]=len; } } int main() { int n,i; catalan(); while(scanf("%d",&n)!=EOF) { for(i=b[n]-1;i>=0;i--) { printf("%d",a[n][i]); } printf("\n"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdoj 1023 Train Problem II 【卡特兰数】
标签:
原文地址:http://blog.csdn.net/longge33445/article/details/48023535