码迷,mamicode.com
首页 > 其他好文 > 详细

HDU1023 Train Problem II【Catalan数】

时间:2015-08-17 12:09:35      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

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数】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/47721463

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!