搭阶梯

题目:

【问题描述】

有一种空心四方钢材,如图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]); 
}
原文地址:https://www.cnblogs.com/xuanyiming/p/7506534.html