二叉树数
二叉树数
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;
}