题目大意:给出一棵n节点的二叉树,求其组成的总数。
解题思路:典型的卡特兰数裸的题目,详见:
http://baike.baidu.com/view/2499752.htm 公式:Cn=1/(n-1)*C(n-2,2n-4);
由于是大数的卡特兰数,涉及到一个计算问题,比较麻烦。
不过由于以前在其他地方应用过,有MiYu的大数版卡特兰数模版,就直接套用了。
我找不到原来的地址了,不过有别人转载的文章:
http://blog.csdn.net/geniusluzh/article/details/5860975 这里的代码的MiYu的代码,仅供参考。
1
#include <iostream>
2
#include <cstdio>
3
#include <algorithm>
4
#include <cstring>
5
6
using namespace std;
7
#define MAX 105
8
#define BASE 10000
9
typedef int myType[MAX+10];
10
void multiply ( int a[], int Max, int b ) //大数乘小数
11

{ int i,array=0;
12
for (i=Max-1; i>=0; i--)
13
{
14
array+=b*a[i];
15
a[i] = array%BASE;
16
array /= BASE;
17
}
18
}
19
void divide ( int a[], int Max, int b ) //大数除小数
20

{
21
int i,div=0;
22
for (i=0;i<Max; i++)
23
{
24
div = div*BASE + a[i];
25
a[i] = div / b;
26
div %= b;
27
}
28
}
29
void outPut ( myType ctl[MAX] ,int N )
30

{
31
int i = 0;
32
while ( i < MAX && ctl[N][i] == 0 )
33
{
34
i ++ ; //去前导0
35
}
36
cout << ctl[N][i++];
37
while ( i < MAX )
38
{
39
40
printf ( "%04d", ctl[N][i++] );
41
}
42
cout << endl;
43
}
44
void setNum ( myType ctl[MAX] )
45

{
46
memset ( ctl[1], 0, MAX * sizeof ( int ) );
47
ctl[1][MAX-1] = 1;
48
for ( int i = 2; i < 101; i ++ )
49
{
50
memcpy ( ctl[i], ctl[i-1], MAX * sizeof ( int ) );
51
multiply ( ctl[i], MAX, 4 * i - 2 );
52
divide ( ctl[i], MAX, i + 1 );
53
}
54
}
55
myType ctl[MAX];
56
int main()
57

{
58
setNum ( ctl );
59
int N;
60
while ( cin >> N ) // 这里根据各题要求需要做相应变化
61
{ outPut ( ctl, N ); }
62
return 0;
63
}
64