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!}$$

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

  • 相关阅读:
    【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入
    【2018.04.27 C与C++基础】关于switch-case及if-else的效率问题
    【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一
    March 11th, 2018 Week 11th Sunday
    March 10th, 2018 Week 10th Saturday
    March 09th, 2018 Week 10th Friday
    March 08th, 2018 Week 10th Thursday
    March 07th, 2018 Week 10th Wednesday
    ubantu之Git使用
    AMS分析 -- 启动过程
  • 原文地址:https://www.cnblogs.com/lfri/p/11324672.html
Copyright © 2011-2022 走看看