• 树屋阶梯(卡特兰数+高精除低精+高精乘低精)


    树屋阶梯

    来源:
    安徽省选 2012
    题目描述:
      暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题。由于地上露营湿气重,必须选择在高处的树屋露营。小龙分配的树屋建立在一颗高度为 N+1 尺(N 为正整数)的大树上,正当他发愁怎么爬上去的时候,发现旁边堆满了一些空心四方钢材,经过观察和测量,这些钢材截面的宽和高大小不一,但都是 1 尺的整数倍,教官命令队员们每人选取 N 个空心钢材来搭建一个总高度为 N 尺的阶梯来进入树屋,该阶梯每一步台阶的高度为 1 尺,宽度也为 1 尺。如果这些钢材有各种尺寸,且每种尺寸数量充足,那么小龙可以有多少种搭建方法?(注:为了避免夜里踏空,钢材空心的一面绝对不可以向上。)
    以树屋高度为 4 尺、阶梯高度 N=3 尺为例,小龙一共有5 种搭建方法。
    输入描述:
    一个正整数N(1≤N≤500) ,表示阶梯的高度。
    输出描述:
    一个正整数,表示搭建方法的个数。(注:搭建方法个数可能很大。)
    样例输入:
    3
    样例输出:
    5

    #include<iostream>
    using namespace std;
    const int maxn=100001;
    int n,len,f[maxn],ans[maxn];
    void mul(int x)
    {
        for(int i=1;i<=len;i++)
        ans[i]=ans[i]*x;
        for(int i=1;i<=len;i++)
        if(ans[i]>9)
        {
            ans[i+1]=ans[i+1]+ans[i]/10;
            ans[i]=ans[i]%10;
        }
        while(ans[len+1])
        {
            len++;
            ans[len+1]=ans[len+1]+ans[len]/10;
            ans[len]=ans[len]%10;
        }
    }
    void div(int x)
    {
        int a[maxn],b[maxn],tmp=0;
        for(int i=1;i<=len;i++)
        a[i]=ans[len-i+1];
        for(int i=1;i<=len;i++)
        {
            b[i]=(tmp*10+a[i])/x;
            tmp=(tmp*10+a[i])%x;
        }
        for(int i=1;i<=len;i++)
        ans[i]=b[len-i+1];
        while(!ans[len]&&len>1)
        len--;
    }
    void work(int k)
    {
        mul(4*k-2);
        div(k+1);
    }
    int main()
    {
        f[0]=f[1]=1;
        ans[1]=1,len=1;
        cin>>n;
        for(int i=2;i<=n;i++)
        work(i);
        for(int i=len;i>=1;i--)
        cout<<ans[i];
        return 0;
    }
  • 相关阅读:
    CSP2019 Day2T3 树的重心
    51nod1835 完全图
    [HNOI2015]亚瑟王
    [六省联考2017]分手是祝愿
    洛谷P4550 收集邮票
    06_手工负载分担(数通华为)
    05_配置交换机SSH服务(数通华为)
    04_配置交换机Telnet服务(数通华为)
    03_vlan & access & trunk 口(数通华为)
    02_搭建HTTP客户端与服务器(数通华为)
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070946.html
Copyright © 2020-2023  润新知