DestinHistoire

 

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

题目描述

分析

  设 \(f[i]\) 为阶梯高度为 \(i\) 的方案数,显然 \(f[0]=f[1]=1\)。

  有 \(n\) 个拐角且只允许放 \(n\) 个矩形,也就是说,每个矩形恰好覆盖一个拐角。

  画出 \(n=5\) 的阶梯:

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

  覆盖 \(1\):

QQ截图20201113183255.png

  右边就是 \(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)    收藏  举报

导航