- problem link:http://acm.hdu.edu.cn/showproblem.php?pid=1023
- 我们都知道火车进站问题,一堆火车以严格的顺序到一个站里,问出来的时候有多少种顺序。
- 此题就是卡特兰数的典型应用:请参考:卡特兰数讲解
- 上代码了,有注释:
#include<iostream>
#include<cstring>
using namespace std;
const int N=100;
const int val=10000;
int a[101][N],i,n;
void multiply(int a[],int b){
int i,res=0;
for(i=N-1;i>=0;i--){
res+=b*a[i];
a[i]=res%val;
res/=val;
}
}
void divide(int a[],int b){
int i,div=0;
for(i=0;i<N;i++){
div=div*val+a[i];
a[i]=div/b;
div%=b;
}
}
int main(){
for(i=2,a[1][N-1]=1;i<101;i++){
memcpy(a[i],a[i-1],N*sizeof(int));
multiply(a[i],4*i-2);
divide(a[i],i+1);
}
while(cin>>n){
for(i=0;i<N&&a[n][i]==0;i++);
cout<<a[n][i++];
for(;i<N;i++)printf("%04d",a[n][i]);
cout<<endl;
}
}