先用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;
}