卡特兰数
#include<cstdio>//卡特兰数 + 记忆化搜索
//h(n)=C(2n,n)/(n+1)
//卡特兰数背景:
//1.在圆上有2N个不同的点 N条线段把这些点连接 每个点连一条 使所有的线段都不相交
//2.对凸n+2边形进行不同的三角形分割(只连接顶点对形成n个三角形)数
//3.n个数入栈后的出栈的排列总数
#define mod 100000007
#define ll long long
using namespace std;
int n;
ll f[3003];
ll solve(int x){
if(x==0||x==1) return 1;
if(f[x]) return f[x];
if(f[x]==0){
ll ans=0;
for(int i=1;i<=x;i++){
ans=(ans+solve(i-1)*solve(x-i))%mod;
}
f[x]=ans;
return ans%mod;
}
}
int main(){
scanf("%d",&n);
printf("%lld",solve(n));
return 0;
}

浙公网安备 33010602011771号