洛谷P2532 [AHOI2012]树屋阶梯(Catalan数)
题目描述
输入输出格式
输入格式:
一个正整数N(1<=N<=500),表示阶梯的高度。
输出格式:
一个正整数,表示搭建方法的个数。(注:搭建方法的个数可能很大)
输入输出样例
输入样例#1:
3
输出样例#1:
5
说明
40%的数据:1<=N<=20
80%的数据:1<=N<=300
100%的数据:1<=N<=500
/* Catalan数套个高精 */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; int a[1010],b[1010]; struct node{ int len,zu[1010]; node operator * (const int x)const{ memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); node res;res.len=0; int l=len; for(int i=1,j=l;i<=l;i++,j--)a[i]=zu[j]; for(int i=1;i<=l;i++){ b[i]+=a[i]*x; b[i+1]+=b[i]/10; b[i]=b[i]%10; } while(b[l+1]){ l++; b[l+1]=b[l]/10; b[l]%=10; } res.len=l; for(int i=1,j=l;i<=l;i++,j--){ res.zu[i]=b[j]; } return res; } node operator / (const int x)const{ memset(a,0,sizeof(a)); node res;res.len=0; int y=0; for(int i=1;i<=len;i++){ a[i]=(y*10+zu[i])/x; y=(y*10+zu[i])-a[i]*x; } int s=1; while(!a[s])s++; for(int i=s;i<=len;i++)res.zu[++res.len]=a[i]; return res; } }h[510]; int main(){ int n; scanf("%d",&n); h[0].len=1;h[0].zu[1]=1; for(int i=1;i<=n;i++){ h[i]=h[i-1]*(4*i-2)/(i+1); } for(int i=1;i<=h[n].len;i++)printf("%d",h[n].zu[i]); return 0; }