1. 程式人生 > >洛谷P2532 [AHOI2012]樹屋階梯(Catalan數)

洛谷P2532 [AHOI2012]樹屋階梯(Catalan數)

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數)