洛谷P2532 [AHOI2012]樹屋階梯(Catalan數)
阿新 • • 發佈:2017-08-26
names images res main truct const () sizeof -1
P2532 [AHOI2012]樹屋階梯
題目描述
輸入輸出格式
輸入格式:
一個正整數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; }
洛谷P2532 [AHOI2012]樹屋階梯(Catalan數)