卡特兰公式 f(n) = C(2 * n, n ) / n + 1
#include <iostream>
#include <vector>
using namespace std;
typedef long long LL;
const int N = 2000;
int prime[N], cnt[N], idx;
bool vis[N];
void get_prime()
{
for (int i = 2; i <= 210; i++)
{
if (!vis[i])
{
prime[idx++] = i;
}
for (int j = 0; prime[j] <= 210 / i; j++)
{
vis[i * prime[j]] = true;
if (i % prime[j] == 0) break;
}
}
}
int get(int a, int x)
{
int res = 0;
while (a)
{
res += a / x;
a /= x;
}
return res;
}
vector<int> mul(vector<int> a, int b)
{
int t = 0;
vector<int> c;
for (int i = 0; i < a.size(); i++)
{
t += a[i] * b;
c.push_back(t % 10);
t /= 10;
}
while (t) c.push_back(t % 10), t /= 10;
return c;
}
vector<int> div(vector<int> a, int b)
{
int t = 0;
vector<int> c;
bool flag = false;
for (int i = a.size() - 1; i >= 0; i--)
{
t = t * 10 + a[i];
int x = t / b;
if (x || flag)
{
flag = true;
c.push_back(x);
t %= b;
}
}
return c;
}
int main()
{
int n;
get_prime();
while (cin >> n)
{
//cout << idx << endl;
for (int i = 0; i < idx; i++)
{
cnt[i] = get(2 * n, prime[i]) - get(n, prime[i]) * 2;
}
vector<int> res(1, 1);
for (int i = 0; i < idx; i++)
{
//cout << i << ' ' << cnt[i] << endl;
for (int j = 0; j < cnt[i]; j++)
{
res = mul(res, prime[i]);
}
}
res = div(res, n + 1);
for (int i = 0; i < res.size(); i++) cout << res[i];
cout << endl;
}
return 0;
}