题目大意:给出一棵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