1. 程式人生 > >HDU1023 Train Problem II【Catalan數】

HDU1023 Train Problem II【Catalan數】

位長 除法 題目 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數】