zoukankan      html  css  js  c++  java
  • 搭阶梯

    题目:

    【问题描述】

    有一种空心四方钢材,如图1.1所示:

    经过观察和测量,这些钢材截面的宽和高大小不一,但都是1尺的整数倍。现在需要用这种钢材搭建一个层高为N的阶梯,该阶梯每一步台阶的高度为1尺,宽度也为1尺。如果这些钢材有各种尺寸,且每种尺寸数量充足,那么Amber可以有多少种搭建方法?(注:为了避免夜里踏空,钢材空心的一面绝对不可以向上。)

    以阶梯高度3为例,共有5种方法,如图1.2所示。

    【输入格式】

    一个正整数 N,表示阶梯的高度。

    【输出格式】

    一个正整数,表示搭建方法的个数。

    【输入样例】

    3

    【输出样例】

    5

    【数据范围】

    40% 的数据 1≤N≤20 

    80% 的数据 1≤N≤300 
    100%的数据 1≤N≤500

    题解:

    卡特兰数,直接上公式,注意高精度

    代码:

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    const int N=100005;
    int len,a[N],n;
    void cf(int x)
    {
        for (int i=1;i<=len;i++)a[i]*=x;
        for (int i=1;i<=len;i++)
         {
             a[i]+=(a[i-1]/10);
             a[i-1]%=10;
         }
        while (a[len]>9)
         {
             a[++len]=a[len-1]/10;
             a[len-1]%=10;
         }  
    }
    void qf(int x)
    {
        int p=0;
        for (int i=len;i;i--)
         {
             int q=a[i];
             a[i]=(a[i]+p*10)/x;
             p=(p*10+q)%x;
         }
        while (!a[len])len--; 
    }
    int main()
    {
        freopen("stair.in","r",stdin);
        freopen("stair.out","w",stdout);    
        scanf("%d",&n);
        len=a[1]=1;
        for (int i=n+1;i<=2*n;i++)
         {
             cf(i);
             qf(i-n);
         }
        qf(n+1); 
        for (int i=len;i;i--)printf("%d",a[i]); 
    }
  • 相关阅读:
    穷举、迭代、以及while代替for循环的使用
    for循环与for循环嵌套
    day07 数据类型补充
    day06
    day05
    day04
    python2 和 python3 的区别
    day03
    第一周笔记
    day02笔记
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/7506534.html
Copyright © 2011-2022 走看看