Description
Input
Output
Sample Input
Sample Output
Hint
The result will be very large, so you may not process it by 32-bit integers
注:问题为求共有多少种出栈方法,可转化为卡特兰数问题,有两个公式:
Cn=C(2n,n) / (n+1)!;(公式在查一下)
递推公式 h(n ) = h(n-1)*(4*n-2) / (n+1);
#include<iostream>
#include<stdio.h>
using namespace std;
int a[105][105]={ {0} }; //存储1---100的卡特兰数组
int b[105]={ 0 }; //存储每一位的位数;第一位不用
int main()
{
int carry=0,i,n,j,m,temp,k,digit=1;
a[1][0]=1; //1!=1;
b[1]=1; //第一位
for(i=2;i<=100;i++)
{
k=4*i-2;
m=i+1;
for(j=0;j<digit;j++) //大数乘法
{
temp=a[i-1][j]*k+carry;
a[i][j]=temp%10;
carry=temp/10;
}
while(carry)
{
a[i][digit++]=carry%10;
carry/=10;
}
for(j=digit-1;j>=0;j--) //大数除法
{
carry=a[i][j]%m;
a[i][j]/=m;
if(carry)
a[i][j-1]+=carry*10;
}
while(!a[i][digit-1]) //去高位零
digit--;
b[i]=digit;
}
while(cin>>n)
{
for(j=b[n]-1;j>=0;j--)
cout<<a[n][j];
cout<<endl;
}
return 0;
}