HDU-3723 Delta Wave(卡特兰数+大数递推)

题意:

从坐标(0, 0)到(n, 0)的折线,这条折线每向右延伸一个单位长度,高度要么不变,要么+1,要么-1,(不能到y=0以下)已知n,求这种折线种数。

思路:

想要从(0,0)到(n,0),说明此过程中必定要向上向下的次数相同,且限制不能下降到y轴下,所以正好满足卡特兰数的入栈出栈性质,于是问题就转换成了从n次中选择2*k次进行向上向下。不过直接去用大数进行运算会超时,即预处理大数组合数1e5的运算会超时。。。已知ans[k] = C(n, 2*k) * C(2*k, k)/(k+1),另ans[k]除以ans[k-1]得递推公式:ans[k] = ans[k] * (n-2*k+2) * (n-2*k+1) / (k*(k+1))。

代码:

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

public class Main {

	static int maxn = 10005;
	static BigInteger f[] = new BigInteger[maxn];
	static BigDecimal mod1 = new BigDecimal("1E+100");
	static BigInteger mod = mod1.toBigInteger();
	static BigInteger ans, tmp;
	static int n, up;
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		while(cin.hasNext()) {
			n = cin.nextInt();
			ans = BigInteger.ONE;
			tmp = BigInteger.ONE;
			up = n/2;
			for(int i = 1; i <= up; ++i) {
				tmp = tmp.multiply(BigInteger.valueOf(n-2*i+2))
						.multiply(BigInteger.valueOf(n-2*i+1))
						.divide(BigInteger.valueOf(i*(i+1)));
				ans = ans.add(tmp);
			}
			System.out.println(ans.mod(mod));
		}
	}

}


继续加油~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值