http://acm.hdu.edu.cn/showproblem.php?pid=1023
大意
给定入栈顺序,问合法的出栈顺序有多少个。
思路
卡特兰数,定义进栈为0,出栈为1,那么入栈出栈操作序列又01串组成,那么合法的出栈顺序满足任意前k个序列都满足0的个数大于等于1。这也就是卡特兰数。
code
import java.math.BigInteger;
import java.util.Scanner;
public class Main{
static int n;
public static void main(String[] args) {
Scanner ipt = new Scanner(System.in);
while(ipt.hasNext()){
n = ipt.nextInt();
BigInteger res1 = new BigInteger("1");
BigInteger res2 = new BigInteger("1");
BigInteger res3 = new BigInteger("1");
BigInteger res4 = new BigInteger("1");
BigInteger ans,ans1;
for(int i = 1; i <= 2*n; i++){
res1 = res1.multiply(new BigInteger(String.valueOf(i)));
}
for(int i = 1; i <= n; i++){
if(i < n) res3 = res3.multiply(new BigInteger(String.valueOf(i)));
res2 = res2.multiply(new BigInteger(String.valueOf(i)));
res4 = res4.multiply(new BigInteger(String.valueOf(i)));
}
res4 = res4.multiply(new BigInteger(String.valueOf(n+1)));
//System.out.println(res2);
ans = res1.divide(res2.multiply(res2));
//System.out.println(ans);
ans1 = res1.divide(res3.multiply(res4));
ans = ans.subtract(ans1);
System.out.println(ans);
}
}
}