卡特兰数。
递推公式:h(n)=h(n-1)*(4*n-2)/(n+1)
用到了大数乘法和大数除法。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define MAXN 700
using namespace std;
void Mult(char *a,int b,char* back)
{
int c[MAXN]= {0};
int L=strlen(a);
for(int i=L-1,j=0; i>=0; --i,++j)
c[j]=(a[i]-'0')*b;
for(int i=0; i<=L+10; ++i)
{
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
bool zero=false;
int p=0;
for(int i=L+10; i>=0; --i)
{
if(c[i]) zero=true;
if(zero) back[p++]=c[i]+'0';
}
if(!zero) back[p++]='0';
back[p]=0;
}
void Divi(char *a,int b,char *back)
{
int rem=0,num=0,p=0;
int L=strlen(a);
for(int i=0; i<L; ++i)
{
num=rem*10+a[i]-'0';
back[p++]=num/b+'0';
rem=num%b;
}
back[p]=0;
int q=0;
for(int i=0; i<p; ++i)
if(back[i]!='0')
{
q=i;
break;
}
strcpy(back,back+q);
}
char num[1005][MAXN];
int main()
{
strcpy(num[1],"1");
for(int i=2;i<=1000;++i)
{
char temp[MAXN],b[MAXN];
Mult(num[i-1],4*i-2,temp);
Divi(temp,i+1,num[i]);
}
int n;
while(scanf("%d",&n)!=EOF)
printf("%s\n",num[n]);
return 0;
}