LA 5092 && hdu 3723 Delta Wave (卡特兰数)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3723 and http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20568

题意:有种折线每向右延伸一个单位长度,高度要么不变,要么加1,要么减1。而且任何时刻高度不能低于0。求这种折线最终高度为0的情况总数。

分析:由于任何时刻斜向上的线不小于斜向下的线的数目,而且最终相等,,,,,卡特兰数模型。卡特兰数资料 若有i条斜向上的线,那么同样会有i条斜向下的线,方案数就是catalan(i),由于还有n-2*i条水平直线,将这些水平直线任意放的方案数为C(n,n-2*i)=C(n,2*i),那么对于有i条斜向上的线的总方案数有:S(i)=C(n,2*i)*catalan(i)。但是从0~n/2枚举斜向的线,然后每一个单独计算,时间复杂度比较高,可以考虑直接由S(i-1)计算S(i),通过化简可以得到S(i)=S(i-1)*(n-2*i+2)*(n-2*i+1)/(i*(i+1))。

代码:

import java.math.BigInteger;
import java.util.Scanner;

public class Main{

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin = new Scanner(System.in);
		while(cin.hasNext())
		{
			int n=cin.nextInt();
			BigInteger ans=(BigInteger.ONE);
			BigInteger cur=(BigInteger.ONE);
			for(int i=1;i<=n/2;i++)
			{
				cur=cur.multiply(BigInteger.valueOf(n-2*i+2)).multiply(BigInteger.valueOf(n-2*i+1));
				cur=cur.divide(BigInteger.valueOf(i*i+i));
				ans=ans.add(cur);
			}
			System.out.println(ans.mod(BigInteger.TEN.pow(100)));
		}
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值