BZOJ-2822 [AHOI2012]树屋阶梯(卡特兰数+大数)
题目描述


分析
设 \(f[i]\) 为阶梯高度为 \(i\) 的方案数,显然 \(f[0]=f[1]=1\)。
有 \(n\) 个拐角且只允许放 \(n\) 个矩形,也就是说,每个矩形恰好覆盖一个拐角。
画出 \(n=5\) 的阶梯:

现在枚举右下角的 \(0\) 覆盖的哪一个拐角。
覆盖 \(1\):

右边就是 \(n=4\) 的子问题,方案数为 \(f[0]\times f[4]\)。
覆盖 \(2\):

左边是 \(n=1\) 的子问题,右边是 \(n=3\) 的子问题,方案数为 \(f[1]\times f[3]\)。
覆盖 \(3\):

左边是 \(n=2\) 的子问题,右边是 \(n=2\) 的子问题,方案数为 \(f[2]\times f[2]\)。
覆盖 \(4\):和覆盖 \(2\) 同理。
覆盖 \(5\):和覆盖 \(1\) 同理。
总方案数为 \(f[n]=\displaystyle\sum_{i=0}^{n-1}f[i]·f[n-i-1]\),即卡特兰数的递推式。
代码
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner cin=new Scanner(System.in);
BigInteger fz=BigInteger.valueOf(1),fm=BigInteger.valueOf(1);
int n=cin.nextInt();
for(int i=1;i<=2*n;i++)
fz=fz.multiply(BigInteger.valueOf(i));
for(int i=1;i<=n;i++)
fm=fm.multiply(BigInteger.valueOf(i));
for(int i=1;i<=n+1;i++)
fm=fm.multiply(BigInteger.valueOf(i));
System.out.println(fz.divide(fm));
}
}
posted on 2020-11-13 18:43 DestinHistoire 阅读(142) 评论(0) 收藏 举报
浙公网安备 33010602011771号