zoukankan      html  css  js  c++  java
  • [HNOI2009] 有趣的数列——卡特兰数与杨表

    [HNOI 2009]

     我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件:

        (1)它是从1到2n共2n个整数的一个排列{ai};

        (2)所有的奇数项满足a1<a3<…<a2n-1,所有的偶数项满足a2<a4<…<a2n

        (3)任意相邻的两项a2i-1与a2i(1≤i≤n)满足奇数项小于偶数项,即:a2i-1<a2i

        现在的任务是:对于给定的n,请求出有多少个不同的长度为2n的有趣的数列。因为最后的答案可能很大,所以只要求输出答案 mod P的值。

    分析:

    当然,可以打表找规律。

    但是,如果学习了杨表的话,很显然,这就是一个 $2 imes n$ 的标准杨表,使用勾子公式,答案为 $frac{(2n)!}{(n+1)!cdot n!} = frac{C_{2n}^n}{n+1}$,这也就是卡特兰数。

    卡特兰数的扩展问题

    首先,我们来看一个最简单的问题:

    我在学校门口卖奶茶,奶茶一元一杯。今天下午开门的时候,我发现找零的钱忘带了。
    这时候来了 2n 个人,其中 n 个人身上只有一张一元钱,另外 n 个人身上只有一张两元钱。我就让他们排成一队,然后用这 n 个人的一元钱来找给付两元的人。当然,排队的时候得保证每次来一个付两元的人的时候都有的找。
    假设所有拿一元的人和拿两元的人都没有分别,我现在想知道,他们有多少种排队方式?

    易知,答案即第 n 个Catalan数。

    再看如下的升级问题,

    升级1: 条件同上,但这时候来的人数为 3n ,其中 n 个人只有一张一元钱,n 个只有一张两元钱, n 个只有一张三元钱(假设题设的每种面值的钞票均存在)。我仍然让他们排成一队,只要有付两元的就用一元找,付三元的就用两元找。同样得保证每当需要找钱时有对应的钱可以找。求他们有多少种排队方式?

    以及最终问题:

    升级2: 条件同上,但这时候来的人数为 mn,其中拥有面值为一元至 m 元的人均有 n 个。每当支付 k (1 < k <= m-1)元时用 k-1 面值的钞票去找零。求合法排队方式数。

    答案其实就是 n 行 m 列的杨表的种数,由勾子公式

    $$frac{(nm)!}{prod_{k=0}^{m-1} (n+k)!/k!}$$

    参考链接:如何求解这道卡特兰数的扩展问题——知乎

  • 相关阅读:
    Redis配置文件的使用
    WEB请求处理一:浏览器请求发起处理
    Nginx配置文件(nginx.conf)配置详解
    【node】------mongoose的基本使用
    Promise.resolve()与new Promise(r => r(v))
    promise是什么?
    apiDoc
    apiDoc 使用指南
    微信小程序-性能与体验优化
    微信小程序-调取上一页的方法
  • 原文地址:https://www.cnblogs.com/lfri/p/11324672.html
Copyright © 2011-2022 走看看