先用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;
} 
京公网安备 11010502036488号