HDU1023 Train Problem IICatalan数

Posted blfbuaa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU1023 Train Problem IICatalan数相关的知识,希望对你有一定的参考价值。

题目链接:

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 IICatalan数的主要内容,如果未能解决你的问题,请参考以下文章

C - Train Problem II——(HDU 1023 Catalan 数)

Train Problem II HDU 1023 卡特兰数

HDU1023 Train Problem IICatalan数

(母函数 Catalan数 大数乘法 大数除法) Train Problem II hdu1023

HDU 1023 Train Problem II 大数打表Catalan数

杭电1023Train Problem II