题目:
【问题描述】
有一种空心四方钢材,如图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]); }