贴个大数阶乘,乘法,除法的代码
卡特兰数
合法序列数量 = 序列总数量 - 不合法序列的总量
序列总数可以这样计算m+n 个位置中, 选择 n 个位置出来填上 1, 所以是 C(m+n, n)
不合法序列的数量就是: m+n 个位置中, 选择 m+1 个位置出来填上 1 所以是 C(m+n, m+1)
然后每个人都是不一样的,所以需要全排列 m! * n!
所以最后的公式就是(C(m+n, n)-C(m+n, m+1))*m!*n!
#include<stdio.h> int main () { int i,j,len=1,r,temp; int a[201][400]={0}; a[1][0]=1; for(i=2;i<=200;i++) { for(j=0;j<len;j++) a[i][j]=a[i-1][j]*i; for(j=0,r=0;j<len;j++) { temp=a[i][j]+r; a[i][j]=temp%10 ; r=temp/10; } while(r) { a[i][len++]=r%10; r/=10; } } int m,n,f=1; while(scanf("%d%d",&m,&n) && m+n) { if(m<n) { printf("Test #%d:\n",f++); puts("0"); } else { printf("Test #%d:\n",f++); len=400; int b[500]={0}; for (j=0,r=0;j<len;j++) { temp=a[m+n][j]*(m+1-n)+r; b[j]=temp%10; r=temp/10; } while(r) { b[len++]=r; r/=10; } for(j=len-1,r=0;j>=0;j--) { temp=r*10+b[j]; b[j]=temp/(m+1); r=temp%(m+1); } while(!b[len]) len--; for(j=len;j>=0;j--) printf("%d",b[j]); puts(""); } } return 0; }