UVa:10303 How Many Trees ?

来源:互联网 发布:c语言的strtok 编辑:程序博客网 时间:2024/06/14 18:00

卡特兰数。

递推公式:h(n)=h(n-1)*(4*n-2)/(n+1)

用到了大数乘法和大数除法。

 

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#define MAXN 700using 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;}


 

0 0
原创粉丝点击