题目链接:http://poj.org/problem?id=2084。
思路:找规律,发现符合卡特兰数 规律(1,1,2,5,14,42…),卡特兰数的递推式a[i]=a[i-1] * (4*i-2)/(i+1),n最大为100,利用万进制来保存并计算数据。代码实现如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 101;
int a[maxn][maxn];
void mul_num(int i, int val) {
int jinwei = 0;
for (int j = maxn-1; j >= 0; j--) {
int num = a[i][j]*val + jinwei;
a[i][j] = num % 10000;
jinwei = num / 10000;
}
}
void div_num(int i, int val) {
int jiewei = 0;
for (int j = 0; j < maxn; j++) {
int num = jiewei*10000 + a[i][j];
a[i][j] = num / val;
jiewei = num % val;
}
}
int main() {
int n;
//preprocess
memset(a, 0, sizeof(a));
a[1][maxn-1] = 1;
for (int i = 2; i < maxn; i++) {
for (int j = 0; j < maxn; j++) a[i][j] = a[i-1][j];
mul_num(i, 4*i-2);
div_num(i, i+1);
}
while (cin >> n && n != -1) {
int k;
for (k = 0; k < maxn; k++) {
if (a[n][k]) break;
}
cout << a[n][k++];
for (; k < maxn; k++) {
printf("%04d", a[n][k]);
}
cout << endl;
}
return 0;
}