catalan数的简单应用: h(n) = ((4 * n - 2) * h(n - 1) / (n + 1) /* Author: ACb0y Date: 2010-11-12 Type: 这道题是简单的卡特兰数,满足递推公式h(n)=(4*n-2)*h(n-1)/(n+1); ProblemId: hdu 1023 Train Problem II Result: 3184349 2010-11-12 16:29:17 Accepted 1023 0MS 352K 1105 B G++ ACb0y */ #include <iostream> using namespace std; struct node { int data[200]; int len; }; int n; node ans[101]; void print_ans(int pos) { for (int i = ans[pos].len - 1; i >= 0; --i) { printf("%d", ans[pos].data[i]); } printf("/n"); } void get_ans() { int i, j; int up; ans[1].data[0] = 1; ans[1].len = 1; for (i = 2; i <= 100; ++i) { for (j = 0; j < ans[i - 1].len; ++j) { ans[i].data[j] = ans[i - 1].data[j] * (4 * i - 2); } ans[i].len = ans[i - 1].len; for (j = up = 0; j < ans[i].len; ++j) { up += ans[i].data[j]; ans[i].data[j] = up % 10; up /= 10; } while (up) { ans[i].data[ans[i].len] = up % 10; up /= 10; ans[i].len++; } for (j = ans[i].len - 1, up = 0; j >= 0; --j) { up *= 10; up += ans[i].data[j]; ans[i].data[j] = up / (i + 1); up %= (i + 1); } while (ans[i].data[ans[i].len - 1] == 0) { ans[i].len--; } } } int main() { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif get_ans(); while (scanf("%d", &n) != EOF) { print_ans(n); } return 0; }