Catalan数-hdu-3723-Delta Wave

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=3723

题目意思:

从坐标为(0,0)的位置开始,每次从(x,y)可以向右走(x+1,y),斜向下走到(x+1,y-1),斜向上走到(x+1,y+1).问走到(n,0)的位置且中间不能走到纵坐标为负的位置,一共有多少种走法。

解题思路:

Catalan数的简单应用。

由于不能走到X轴下方,所以当有k个斜向上时必定有k个斜向下,且对于每个位置之前的斜向上数必须大于等于斜向下的个数,此时就是Catalan数。

所以Tk=C(n,2k)*C(2k,k)/(k+1).但是n有10000,打表C(n,k)打不下。

发现可知,可以借助相邻两项的递推关系:Tk/Tk-1=(n-2k+2)*(n-2k+1)/(k*(k+1)).

注意求Tk时,应该先乘完再除不然可能不是整除。

当推出一个公式不能直接求时,可以借助递推Tk/Tk-1 或Tk-Tk-1Tk+Tk-1 构造其他来求。

代码:

import java.math.*;
import java.util.*;


public class Main 
{

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		// TODO Auto-generated method stub
		BigInteger M =new BigInteger("10");
		BigInteger ans=new BigInteger("0");
		BigInteger la=new BigInteger("0");
		
		M=M.pow(100);
		
		Scanner cin=new Scanner(System.in);
		int n;
		
		while(cin.hasNextInt())
		{
			n=cin.nextInt();
			ans=ans.valueOf(1);
			la=la.valueOf(1);
			
			for(int i=1;i<=n/2;i++)
			{
				BigInteger temp=new BigInteger("0");
				temp=BigInteger.valueOf((n-2*i+2)*(n-2*i+1)).multiply(la);
				//temp=temp.multiply(la);
				temp=temp.divide(BigInteger.valueOf(i*(i+1)));
				
				la=temp;
				ans=ans.add(la);
				ans=ans.remainder(M);
				
			}
			System.out.println(ans);
			
		}
		
		

	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值