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