标签:
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