题目大意:给你n个不同的节点,求可以构成多少种二叉树。
解题思路:1)n个节点构成多少种二叉树的问题显然是卡特兰数问题。
递推式:Cn=Cn-1*[(4n-2)/(n+1)]
通项式:Cn=1/(n-1)*C(n-2,2n-4)
2)注意,是n个不同的点,所以点变换顺序形成的二叉树不同故:SUM=Cn*n!
修改了1130的代码...
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 )
{ if (N==0) break;
61
else
62
{for (int p=1; p<=N; p++) multiply ( ctl[N], MAX, p );
63
outPut ( ctl, N ); }
64
}
65
return 0;
66
}
67