二叉树数

二叉树数

Description

求由n个结点构成的不同的二叉树数.n<=100 每个节点均认为是等价的!

Input

输入一个整数n,表示结点数。

Output

输出对应的答案。

Sample Input

3

Sample Output

5

HINT

Source

#include <bits/stdc++.h>
using namespace std;
int f[101][1000];
int tmp[1000];
void mul(int *c,int *a,int *b)
{
    int l1=a[0],l2=b[0],l3;
    l3=l1+l2-1;
    for(int i=1;i<=l1;i++)
        for(int j=1;j<=l2;j++)
        {
            c[i+j-1]+=a[i]*b[j];
            c[i+j]+=c[i+j-1]/10;
            c[i+j-1]%=10;
        }
    while(c[l3+1]>0)
    {
        l3++;
        c[l3+1]+=c[l3]/10;
        c[l3]%=10;
    }
    c[0]=l3;        
}
void add(int *a,int *b)
{
    int l;
    if(a[0]>b[0]) l=a[0];
    else l=b[0];
    for(int i=1;i<=l;i++)
    {
        a[i]+=b[i];
        a[i+1]+=a[i]/10;
        a[i]%=10;
    }
    while(a[l+1]>0)
    {
        l++;
        a[l+1]+=a[l]/10;
        a[l]%=10;
    }
    a[0]=l;
}
int main()
{
    int n;
    memset(f,0,sizeof(f));
    cin>>n;
    f[0][0]=1,f[0][1]=1;
    f[1][0]=1,f[1][1]=1;
    for(int i=2;i<=n;i++)
    {
        f[i][0]=1,f[i][1]=0;
        for(int j=0;j<=i-1;j++)
        {
            memset(tmp,0,sizeof(tmp));
            mul(tmp,f[j],f[i-1-j]);
            add(f[i],tmp);
        }
    }
    for(int i= f[n][0];i>=1;i--)
    printf("%d", f[n][i]);
    return 0;
}
posted @ 2019-12-22 10:50  牛大了的牛大  阅读(285)  评论(0编辑  收藏  举报