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