题解 P1754 【球迷购票问题】
看题解好像没有具体说明为什么是catalan,所以就简单说明一下
一个A买票后售票处会积累50元钱
一个B买票需要售票处找零50元钱
说明在一个B买票前至少需要一个A买过票
那么我们就可以将A看作左括号,B看作右括号
问题就是要求合法得括号匹配,即Catalan数
n得范围开long long不会溢出 所以用一个快一些的递推公式
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long ll;
int n;
ll cat[50];
int main()
{
scanf("%d",&n);
cat[0]=cat[1]=1;
for(int i=2;i<=n;++i)
cat[i]=cat[i-1]*(4*i-2)/(i+1);
cout<<cat[n];
return 0;
}//niiick