題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1133
卡特蘭數的應用:( C(m+n, n) - C(m+n, m+1) ) * m! * n! 化簡即 (m+n)! * (m-n+1) / (m+1)
#include<iostream>
#include<cstring>
#define maxn 390
using namespace std;
int arr[maxn+1];
int main()
{
int m,n,time=1,i,c,j,s,k; //m stand for person has 50 yuan, n stand for 100 yuan
while(cin>>m>>n,m+n)
{
memset(arr,0,sizeof arr);
cout<<"Test #"<<time++<<":"<<endl;
if(m<n)
{
cout<<0<<endl;
continue;
}
arr[0]=1;
for(i=2,c=0;i<=m+n;i++) //(m+n)!
{
for(j=0;j<=maxn;j++)
{
s=arr[j]*i+c;
arr[j]=s%10;
c=(s-arr[j])/10;
}
}
for(c=j=0;j<=maxn;j++) //(m+n)!*(m+1-n)
{
s=arr[j]*(m+1-n)+c;
arr[j]=s%10;
c=(s-arr[j])/10;
}
for(k=maxn;arr[k]==0;k--);
for(c=0,j=k;j>=0;j--) //(m+n)!*(m+1-n)/(m+1)
{
s=(arr[j]+10*c);
c=s%(m+1);
arr[j]=(s-c)/(m+1);
}
for(k=maxn;arr[k]==0;k--);
for(j=k;j>=0;j--)
cout<<arr[j];
cout<<endl;
}
return 0;
}