原题链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1131
题目大意:
n各节点所能构成多少中不同的二叉树。
与1130有所不同。
不是搜索二叉树了,也就没有顺序了,即在搜索二叉树的基础上,乘上n的排序数。即 n!
公式可以化为:
F(n)=F(n-1)*n*(4*n-2)/(n+1)
代码如下:
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
const int base = 10000;
const int N = 100 + 2;
int katelan[N][N];
int main()
{
katelan[0][1] = 1;
//katelan[1][1] = 1;
//katelan[2][1] = 4;
for (int i = 1; i <= 100; i++)
{
for (int j =1; j<100; j++)//大数乘法
{
katelan[i][j] += katelan[i - 1][j] *i*(4 * i - 2);
katelan[i][j + 1] += katelan[i][j] / base;
katelan[i][j] %= base;
}
int temp;
for (int j = 100; j > 0; j--)//大数除法
{
temp=katelan[i][j] % (i + 1);
katelan[i][j-1]+=temp* base;
katelan[i][j] /= (i + 1);
}
}
int n;
while (cin >> n&&n)
{
int i = 100;
while (katelan[n][i] == 0)i--;
cout << katelan[n][i--];
while (i > 0)
printf("%04d", katelan[n][i--]);
cout << endl;
}
return 0;
}