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; }