hdu 1131 Count the Trees

hdu 1131 Count the Trees

Catalan数的组合公式为 Cn=C(2n,n) / (n+1);

此数的递归公式为 h(n ) = h(n-1)*(4*n-2) / (n+1)

卡特兰数的一个应用:

给顶节点组成二叉树的问题。

  给定N个节点,能构成多少种不同的二叉树?

  (能构成h(N)个)

但因为每一个节点都被命名了,也就是每一个节点都当做 是不同的,所以最后每一个卡特兰数都要乘以n!

用组合公式化简得:h(n)=(2n)!/(n+1)! = 2n*(2n-1)* …… *(n+2)。

#include<iostream>
using namespace std;
#define MAX 100
int f[101][100];
inline void multiply(int a[],int Max,int b) //大数乘法,注意参数的传递
{
    int i,s=0;
    for (i = Max-1; i >= 0; i--)   
    {
        s += b * a[i];
        a[i] = s % 10000; // 数组每一位存放大数的四位数字
        s /= 10000;   
    }
}
void init()
{
	memset(f[1],0,MAX*sizeof(int));
	f[1][MAX-1]=1;
	for(int i=2;i<=100;i++)
	{
		f[i][MAX-1]=1;
		for(int j=i*2;j>=i+2;j--)
			multiply(f[i],MAX,j);
	}
}
int main()
{
	int n,i;
	init();
	while(cin>>n,n)
	{
		for (i = 0; i < MAX && f[n][i] == 0; i++); //去掉数组前为0的数字。
        cout << f[n][i++];             //输出第一个非0数
        for (; i < MAX; i++)   
        { 
			printf("%04d",f[n][i]);       //输出后面的数,并每位都保持4位长度!(32767)
		}
        cout << endl;
	}
	return 0;
}
posted @ 2011-09-09 08:47  枕边梦  阅读(315)  评论(0编辑  收藏  举报