Another common social inability is known as ACM (Abnormally Compulsive Meditation). This psychological disorder is somewhat common among programmers. It can be described as the temporary (although frequent) loss of the faculty of speech when the whole power of the brain is applied to something extremely interesting or challenging.
|
Input The input will consist of several input cases, one per line. Each input case will be specified by the number n ( 1 ≤ n ≤ 100 ) of different elements that must be used to form the trees. A number 0 will mark the end of input and is not to be processed.
|
Output For each input case print the number of binary trees that can be built using the n elements, followed by a newline character.
|
Sample Input 1210250
|
Sample Output 146094932480075414671852339208296275849248768000000 |
看完题目就觉得与how many trees很像了,how many trees是catalan数的直接应用,n个结点能组成多少种二叉排序树,而这个题目就不是二叉排序树,而是更简单的二叉树,所以要在二叉排序树的基础上再乘以n个数的排列,就能得到所有情况了,以n=2举个例子:
这个是直接catalan数应用得到的2个结点只有2种情况,1 2的排列有1 2和2 1这2种,在图左树这样结构有2种,右树结构又有2种,一共就有2*2种了,于是得到例子的结果,由此看来,H(n)=H(n)*n!;
化简得到H(n) = n * (4n - 2) * H(n-1) / (n+1);
贴代码:
#include<iostream>
#include<cstdio>
using namespace std;
#define mod 10000
int catalan[101][250]={0};
int b[250]={0};
void bignum_mul(int a[],int l,int b[])
{
int i,j,k;
for(i=0;i<250;i++)
{
b[i]=b[i]+a[i]*l;
if(b[i]>=mod)
{
b[i+1]=b[i]/mod;
b[i]=b[i]%mod;
}
}
}
void bignum_div(int a[],int l,int b[])
{
int i,j,t=0;
for(i=249;i>=0;i--)
if(a[i]>0)
break;
for(i;i>=0;i--)
{
t=t*mod+a[i];
b[i]=t/l;
t=t%l;
}
}
void main()
{
int l,i,j,k,n;
catalan[1][0]=1;
for(i=2;i<=100;i++)
{
l=i*(4*i-2);
k=i+1;
memset(b,0,sizeof(b));
bignum_mul(catalan[i-1],l,b);
bignum_div(b,k,catalan[i]);
}
while(cin>>n && n)
{
for(i=249;i>=0;i--)
if(catalan[n][i]>0)
break;
printf("%d",catalan[n][i]);
for(j=i-1;j>=0;j--)
printf("%04d",catalan[n][j]);
cout<<endl;
}
}