HDU

来源:互联网 发布:python学习手册 mobi 编辑:程序博客网 时间:2024/06/05 00:59

题目:让你输出从点(0,0)到点(N,0)一共有多少种方法,点(r,c)可以到点(r,c+1),(r+1,c+1),(r-1,c+1),但是不能走到x轴的下方。

下图是N=4的方法


Sample Input
34
Sample Output
49


思路:行数要么+1,要么+0,要么-1,因为不能到x轴的下方,所以任意时刻+1的次数都要大于等于-1的次数,所以就是卡特兰数了呀。

设总的+1的次数为i

ans+=C(n,2*i)*h(i-1)*(4*i-2)/(i+1)

代码:

import java.math.*;import java.util.*;public class Main {static BigInteger one = BigInteger.ONE;static BigInteger two =BigInteger.valueOf(2);static BigInteger zero = BigInteger.ZERO;static BigInteger ten = BigInteger.TEN;public static void main(String[] args) {Scanner cin = new Scanner(System.in);int n;while(cin.hasNext()){n=cin.nextInt();BigInteger ans=one,h=one,C=one;int y=0;for(int i=1;2*i<=n;i++){C=C.multiply(BigInteger.valueOf(n-y)).divide(BigInteger.valueOf(y+1));y++;C=C.multiply(BigInteger.valueOf(n-y)).divide(BigInteger.valueOf(y+1));y++;h=h.multiply(BigInteger.valueOf(4*i-2)).divide(BigInteger.valueOf(i+1));//System.out.println(C+"  "+h);ans=ans.add(h.multiply(C));}ans=ans.mod(ten.pow(100));System.out.println(ans);}cin.close();}}