这道题就是卡特兰数+大数
卡特兰数的两种解法
一、令h(0)=1,h(1)=1,catalan数满足递推式 :
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)
二、递推式
h(n)=h(n-1)*(4*n-2)/(n+1);
卡特兰数的应用:
1、括号化
矩阵连乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)
2、出栈次序
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列
3、凸多边形三角划分
在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)
4、给定节点组成二叉搜索树
(能构成h(N)个)注意(这个公式的下标是从h(0)=1开始的)
5、n对括号正确匹配数目
给定n对括号,求括号正确配对的字符串数
-------------------------摘自百度百科
下面给出这道题的代码 因为数字很大 所以用的java
顺便提一下 java创建数组的方法
int[] arr=new int[6];//
BigInteger a[]=new BigInteger[107];
hdu1023 代码
import java.io.*;
import java.math.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin=new Scanner(System.in);
BigInteger a[]=new BigInteger[107];
s[1]=BigInteger.ONE;
for(int i=2;i<105;i++){
a[i]=a[i-1].multiply(BigInteger.valueOf(4*i-2)).divide(BigInteger.valueOf(i+1));
}
while(cin.hasNext()){
int n=cin.nextInt();
System.out.println(a[n]);
}
cin.close();
}
}