#include <iostream> using namespace std; //大数求解卡特兰数 打表法 //公式:C(n + 1) = (4*n - 2)C(n - 1)/(n + 1) #define N 110 #define BASE 10 int num[N][N]; //num[i][0] 保存大数位数,num[i][1]到num[i][num[i][0]]保存着大数的低位到高位 void multi(int a[], int b) { int i = 0, carry = 0; for(i = 1;i <= a[0]; ++i) { a[i] = a[i] * b + carry; carry = a[i] / BASE; a[i] %= BASE; } while(carry) { a[i] = a[i] + carry; carry = a[i] / BASE; a[i] %= BASE; ++i; } a[0] = i - 1; } void divide(int a[], int b) { int i = 0, carry = 0; for (i = a[0];i > 0; --i) { a[i] = carry * BASE + a[i]; carry = a[i] % b; a[i] /= b; } while(!a[a[0]]) { --a[0]; } } int main() { int i = 0, n; num[1][0] = 1; num[1][1] = 1; for (i = 2;i < N; ++i) { memcpy(num[i], num[i-1], sizeof(num[i - 1])); multi(num[i], 4 * i - 2); divide(num[i], i + 1); } while(scanf("%d", &n) != EOF) { for (i = num[n][0]; i >= 1 ; --i) { printf("%d", num[n][i]); } printf("\n"); } return 0; }
hdu1130How Many Trees? 卡特兰数
最新推荐文章于 2020-03-07 17:45:21 发布