题目大意:给你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
6using namespace std;
7#define MAX 105
8#define BASE 10000
9typedef int myType[MAX+10];
10void 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}
19void 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}
29void 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}
44void 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}
55myType ctl[MAX];
56int 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