/*
Problem: hdu 1131 Count the Trees
Lang:C++
题意:
求n个不同节点能组成多少个不同的二叉树。
原理:
亚特兰数,不过需要全排列。化简后可去掉除法。
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
const int SYS = 10000;
//a *= b;
void Multiplication(int *a, int b) {
int c = 0;
int i;
for(i = 1; i <= a[0]; i++) {
c += b * a[i];
a[i] = c % SYS;
c /= SYS;
}
if(c != 0) {
while(c) {
c += a[i];
a[i] = c % SYS;
c /= SYS;
i++;
}
}
a[0] = i - 1;
}
void Show(int *num) {
int i = num[0];
printf("%d", num[i--]);
while(i > 0) {
printf("%04d", num[i--]);
}
puts("");
}
int main () {
int num[100];
int n;
memset(num, 0, sizeof(num));
while(scanf("%d", &n) != EOF && n) {
int i = 1;
while(i <= num[0]) {
num[i++] = 0;
}
num[0] = 1;
num[1] = 1;
for(i = n + 2; i <= 2 * n; i++) {
Multiplication(num, i);
}
Show(num);
}
return 0;
}
hdu 1131 Count the Trees
最新推荐文章于 2017-08-07 14:56:41 发布