题
http://codevs.cn/problem/3112/
题解
分析样例,发现题目中所说的不同形态,对称的可以算作两种,因此设f[i]表示有i个节点的树有多少种形态,那么
fi=f0∗fi−1+f1∗fi−2+...+fi−2∗f1+fi−1∗f0
,即枚举左右子树大小然后乘法原理计数。
由题意,明显
f0=f1=1
所以这个题就成了让你求卡特兰数的第
n
项
卡特兰数公式:
代码
//卡特兰数
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
ll n, ans=1, num[50];
ll gcd(ll a, ll b){return b?gcd(b,a%b):a;}
int main()
{
ll i, j, d;
scanf("%lld",&n);
for(i=1;i<=2*n;i++)num[i]=i;
for(i=2;i<=n;i++)
for(j=n+2;j<=2*n;j++)
while((d=gcd(num[i],num[j]))>1)num[i]/=d,num[j]/=d;
for(i=n+2;i<=2*n;i++)ans*=num[i];
for(i=2;i<=n;i++)ans/=num[i];
printf("%lld\n",ans);
return 0;
}