Train Problem II
组合数学问题,结果是catalan数,公式见http://www.iwebtrados.com.cn/post/213.html
唯一要注意的问题是n比较大,需要用大数来处理。为了避免做大数除法,先做了一个小处理。
#include <stdio.h>
#include <stdlib.h>
int gcd1(int a,int b)
{
int t;
if(a<b) {t=a;a=b;b=t;}
while(b)
{
t=b;
b=a%b;
a=t;
}
return a;
}
void go(int n,int m)
{
int a[1000],b[1000],i,j,k,t,l,s,c;
for(i=0;i<m;i++)
{
a[i]=n-i;
}
for(i=1;i<=m;i++)
{
k=i+1;
for(j=0;j<m;j++)
{
t=gcd1(a[j],k);
if(t>1) {a[j]/=t;k/=t;}
}
}
l=b[0]=1;
for(i=0;i<m;i++)
{
for(c=j=0;j<l;j++)
{
s=b[j]*a[i]+c;
b[j]=s%10000;
c=s/10000;
}
if(c) {
while(c)
{
b[l++]=c%10000;
c/=10000;
}
}
}
printf("%d",b[l-1]);
for(i=l-2;i>=0;i--)
printf("%04d",b[i]);
printf("\n");
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
go(2*n,n);
}
system("pause");
return 0;
}
本文来源于网络小筑 http://www.iwebtrados.com.cn/ , 原文地址:http://www.iwebtrados.com.cn/post/224.html
个人网站:生活百科
本文版权所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。