CodeVS3112 二叉树计数

来源:互联网 发布:c盘数据恢复软件 编辑:程序博客网 时间:2024/06/01 09:31

http://codevs.cn/problem/3112/

题解

  分析样例,发现题目中所说的不同形态,对称的可以算作两种,因此设f[i]表示有i个节点的树有多少种形态,那么fi=f0fi1+f1fi2+...+fi2f1+fi1f0,即枚举左右子树大小然后乘法原理计数。
  由题意,明显f0=f1=1
  所以这个题就成了让你求卡特兰数的第n
  卡特兰数公式:
  

fn=Cn2nn+1

代码

//卡特兰数 #include <cstdio>#include <algorithm>#define ll long longusing 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;}
0 0
原创粉丝点击