先用dp的想法来思考这个问题
设f【i】表示i层的方法数
如何用x之前的f来表示f【x】
我们可以把阶梯以某一层分成两块,这两块都在x~x-1层之间
所以x层就被分层了i,1,n-1-i三个部分
则f【n】=f【i】+f【n-1-i】(分的方法总和),遍历i:1~n-1-i
这就是卡特兰数的模型
C(2*500,,500)大约500位数字所以用高精度
#include<bits/stdc++.h> using namespace std; typedef vector<int> Big; const int N=510; vector<int> f[N]; int n; void print(Big &a){ for(int i=a.size()-1;i>=0;i--) cout<<a[i]; cout<<endl; } vector<int> mul(vector<int> &a,int b){//大数*int vector<int> c; int t=0;//t位低位情况,是否进位 for(int i=0;i<a.size()||t;i++){ if(i<a.size())t+=a[i]*b; c.push_back(t%10); t/=10; } return c; } vector<int> div(vector<int> &a,int b,int &r){//a/b,返回商,a是大数,b是int数,r是余数必须& r=0; vector<int> c; for(int i=a.size()-1;i>=0;i--){ r=r*10+a[i];//前一位剩下的加上现位 c.push_back(r/b); r%=b; } reverse(c.begin(),c.end());//反转,因为除法是从高位开始,加减乘是低位开始,所以pushback后要反转 while(c.size()>1&&c.back()==0) c.pop_back();//去除前导0 return c; } int main(){ cin>>n; f[1].push_back(1); for(int i=2;i<=n;i++){ int r; Big cc; f[i]=div((cc=mul(f[i-1],4*i-2)),i+1,r); } print(f[n]); return 0; }