1 2 3 10
1 2 5 16796HintThe result will be very large, so you may not process it by 32-bit integers.
就是求一个卡特兰数,如果是C++的话 得用高精度,java 的话 得用 BigInteger。。。
解题思路:
只要掌握卡特兰数的公式就行了,两个公式:
1. 组合公式为 Cn = C(2n,n) / (n+1);
2. 递推公式为 h(n ) = h(n-1)*(4*n-2) / (n+1)
我们采用的是第二个,如果用java 写的话还是比较省事儿的,因为直接有个大数类,所以直接调用就行,所以我也先给一个java的代码(也是第一次写java代码 有点小紧张):
My Java Code:
<span style="font-size:18px;">import java.util.*;
import java.math.BigInteger;
public class Main {
    public static void main(String[] args) {
        BigInteger a[] = new BigInteger[105];
        a[0] = BigInteger.ZERO;
        a[1] = BigInteger.ONE;
        for(int i=2;i<=102;i++) {
            a[i] = a[i-1].multiply(BigInteger.valueOf(4*i-2)).divide(BigInteger.valueOf(i+1));
        }
        
        Scanner in = new Scanner(System.in);
        
        while(in.hasNext()) {
            int n=in.nextInt();
            System.out.println(a[n]);
        }
    }
}</span>My Cpp Code:
<span style="font-size:18px;">#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 105;
int a[MAXN][MAXN];
int b[MAXN];
///可以作为模板
void Catalan()
{
    int yu,len;
    a[1][0] = 1;
    a[1][1] = 1;
    len = 1;
    for(int i=2; i<MAXN; i++)
    {
        yu = 0;
        for(int j=1; j<=len; j++)
        {
            int t = (a[i-1][j])*(4*i-2) + yu;
            yu = t/10;
            a[i][j] = t%10;
        }
        while(yu)
        {
            a[i][++len] = yu%10;
            yu /= 10;
        }
        for(int j=len; j>=1; j--)
        {
            int t = a[i][j]+yu*10;
            a[i][j] = t/(i+1);
            yu = t%(i+1);
        }
        while(!a[i][len])
            len--;
        a[i][0] = len;
    }
}
int main()
{
    Catalan();
    int n;
    while(cin>>n)
    {
        for(int i=a[n][0]; i>0; i--)
        cout<<a[n][i];
        puts("");
    }
    return 0;
}
</span>
C - Train Problem II——(HDU 1023 Catalan 数)
原文:http://blog.csdn.net/qingshui23/article/details/51001054