题意:一个圆上给2k个点,连k条线,每个点连一次,问最少把圆分成几块,以及这样的分法种数。
做法:显然每条线不相交是最优方案,最少分成k+1块。然后考虑对标号为1的点,可以连2,4…2k,则
f(k+1)=∑i=0kf(i)∗f(k−i)
这个是catalan数的递推公式。而catalan数的通项是1n+1(2nn),于是就做完了。
然后catalan数的应用大概有进出栈序列数(以及大量变形)和二叉树个数计数,还有满足以上递推公式的计数问题。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll C(int m, int n)
{
ll ans=1;
for(int i=1;i<=n;i++)
{
ans*=m-n+i;
ans/=i;
}
return ans;
}
int main()
{
int n;
scanf("%d", &n);
printf("%lld %d\n",C(2*n, n)/(n+1) , n+1);
}