#include<iostream>
#include<cstdio>
using namespace std;
long long int gcd(long long int a,long long int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
int main()
{
long long int x=1,y=1,yue;
int n;
cin>>n;
//输出为卡特兰数 (2n)!/n!/(n+1)!
//化简得分子为n+2到2n的连乘积,分母为n!
//20!在long long int 界限附近
//如果先计算分子则会越界
//先计算分母,然后计算分子,每次分子做乘法的时候,尽可能与分母约分
for(int i=1;i<=n;i++)
{
y=y*i;
}
for(int i=n+2;i<=2*n;i++)
{
x=x*i;
yue=gcd(x,y);
x=x/yue;
y=y/yue;
}
cout<<x<<endl;
}
洛谷p1754 球迷购票问题 普及/提高- 数论,栈,卡特兰数
最新推荐文章于 2022-08-06 08:21:20 发布