题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1023
题目大意:
一列N节的火车以严格的顺序到一个站里。问出来的时候有多少种顺序。
解题思路:
典型的求Catalan数的题目,可是结果会非常大,所以须要用大数来解决。
Catalan公式为 h(n) = h(n-1) * (4*n-2) / (n + 1),h(0) = h(1) = 1。
AC代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 100; const int BASE = 10000; void Multiply(int A[], int Max, int b) //大数乘法 A[]*b 10000进制 { int Array = 0; for(int i = Max - 1; i >= 0; --i) { Array += b * A[i]; A[i] = Array % BASE; Array /= BASE; } } void Divide(int A[], int Max, int b) //大数除法 A[]/b 10000进制 { int Div = 0; for(int i = 0; i < Max; ++i) { Div = Div * BASE + A[i]; A[i] = Div / b; Div %= b; } } int A[MAXN+10][MAXN+10]; int main() { memset(A,0,sizeof(A)); A[1][99] = 1; for(int i = 2; i < 101; ++i) { for(int j = 0; j < 100; ++j) A[i][j] = A[i-1][j]; Multiply(A[i], MAXN, 4*i-2); Divide(A[i], MAXN, i+1); } int N; while(~scanf("%d",&N) && N != -1) { int i; for(i = 0; i < MAXN && A[N][i] == 0; ++i); //去掉数组前导0 printf("%d",A[N][i++]); //输出第一个非0数 for(; i < MAXN; ++i) //输出后边的数,每位保持4位长度 printf("%04d",A[N][i]); printf("\n"); } return 0; }