洛谷P2532 [AHOI2012]树屋阶梯(Catalan数)

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;
}

 

posted @ 2017-08-26 17:43  Echo宝贝儿  阅读(219)  评论(0编辑  收藏  举报