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

Posted weixu-liu

tags:

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

Train Problem II

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 10372    Accepted Submission(s): 5543

 

 

Problem Description

As we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasing order, how many orders that all the trains can get out of the railway.

 

Input

The input contains several test cases. Each test cases consists of a number N(1<=N<=100). The input is terminated by the end of file.

 

Output

For each test case, you should output how many ways that all the trains can get out of the railway.

 

Sample Input

1

2

3

10

 

Sample Output

1

2

5

16796

Hint

The result will be very large, so you may not process it by 32-bit integers.

 

 

 

注意:

这是卡特兰数,用大数。使用的公式为:

h(n)=h(n-1)*(4*n-2)/(n+1)。

 

用JAVA更简单:

技术分享图片
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner (System.in);
        BigInteger a[]=new BigInteger[101];
        a[0]=BigInteger.ZERO;
        a[1]=BigInteger.ONE;
        for(int i=2;i<=100;i++)
            a[i]=a[i-1].multiply(BigInteger.valueOf(4*i-2)).divide(BigInteger.valueOf(i+1));
        while(in.hasNextInt()) {
            int n=in.nextInt();
            System.out.println(a[n]);
        }
    }
}
View Code

 

接下来是C++:

技术分享图片
#include <iostream>
#include <cstdio>
using namespace std;
int a[105][105];
int i,j,n;
void ctl()         //打表。
{
    a[2][0]=1;
    a[2][1]=2;
    a[1][0]=1;
    a[1][1]=1;
    int len=1,t,yu=0;       //注意初始化。
    for(i=3;i<101;i++)         //先打表求出1到100的所有Catalan数。
    {
        for(j=1;j<=len;j++)              //大数乘法。
        {
            t=a[i-1][j]*(4*i-2)+yu;
            yu=t/10;
            a[i][j]=t%10;       //求每位数的确定的数。
        }
        while(yu)         //进位。一直到yu为0为止。
        {
            a[i][++len]=yu%10;
            yu/=10;
        }
        for(j=len;j>=1;j--)              //大数除法。联系手工除法步骤。
        {
            t=a[i][j]+yu*10;
            a[i][j]=t/(i+1);           //可以看做手工除法的商。
            yu=t%(i+1);              //可以看做手工除法的余数。
        }
        while(!a[i][len])        //去掉前边的0。
        {
            len--;
        }
        a[i][0]=len;
    }
}
int main()
{
    ctl();
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=a[n][0];i>0;i--)
        {
            printf("%d",a[n][i]);
        }   
        puts("");
    }   
    return 0;
} 
View Code

 

以上是关于(母函数 Catalan数 大数乘法 大数除法) Train Problem II hdu1023的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1023 Train Problem II 大数打表Catalan数

大数运算

Train Problem II (卡特兰数+大数问题)

C++的大数除法最快速度的算法

高精度乘法和除法

poj2325 大数除法+贪心