题目链接:
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);
}
}
}