HDU1023 Train Problem II【Catalan數】
阿新 • • 發佈:2017-06-10
位長 除法 題目 using void tar vid urn 進制
題目鏈接:
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; }
HDU1023 Train Problem II【Catalan數】