• 「数学」卡特兰数


    洛谷P1044 [NOIP2003 普及组] 栈

    定义

    经典问题:出栈序列数

    由栈性质可得,某一时刻总操作的入栈数不能少于出栈数,若将入栈视为(+1),出栈视为(-1),则任意时刻该序列前缀和不能小于零,且(+1)(-1)总数相等(均为(n)

    如何求序列方案数

    公式

    易得,不剔除非法序列的情况下,序列总方案数为(dbinom{2n}{n})

    对于任意非法序列,例如:

    [+1,-1,-1,+1,+1,-1 ]

    若找到最先处于非法状态的位置(前缀和小于零的位置),将该位置(例子中的第三个)以及之前的数字全部反转,则会得到一个由(n+1)(+1)(n-1)(-1)构成的序列

    [-1,+1,+1,+1,+1,-1 ]

    反转后的序列在第一个前缀和大于零的位置反转可得到反转前的序列,所以每个非法序列和(n+1)(+1)(n-1)(-1)构成的序列一一对应

    由此得到合法序列数

    [Cat_n=dbinom{2n}{n}-dbinom{2n}{n-1}=frac{dbinom{2n}{n}}{n+1} ]

    可以推出递推式

    [Cat_1=1,Cat_n=frac{dbinom{2n}{n}}{n+1}=frac{dbinom{2n-2}{n-1}*frac{2n*(2n-1)}{n*n}}{n+1}=frac{dbinom{2n-2}{n-1}}{n}*frac{2n*(2n-1)}{n*(n+1)}=Cat_{n-1}*frac{4n-2}{n+1} ]

    还可以拆开

    [Cat_n=frac{prod(4*i-2)}{(n+1)!} ]

    另一种形式:

    [Cat_n=sum_{i=1}^{n}Cat_{i-1}*Cat_{n-i} ]

    若枚举最后一个出栈点的编号(i),那么在(i)入栈之前,前(i-1)个数字必定已经出栈,方案数为(Cat_{i-1}),在(i)出栈前,后(n-i)个数字也已经出栈,方案为(Cat_{n-i})

    由于没有除法,写高精方便,且遇到该形式的递推式可以归纳到卡特兰数

    用法

    输入(3)输出(5)即为卡特兰数

    待更

    拓展

    (n)(+1)(m)(-1,(n≥m)),求任意前缀和不小于零的方案数

    易证

    [ans=dbinom{n+m}{m}-dbinom{n+m}{n+1} ]

  • 相关阅读:
    Codeforces 798C. Mike and gcd problem 模拟构造 数组gcd大于1
    Codeforces 796C. Bank Hacking
    Codeforces 792B. Counting-out Rhyme
    gym 101164 H.Pub crawl 凸包
    hdu 6053 TrickGCD 筛法
    hdu 6041 I Curse Myself 无向图找环+优先队列
    bzoj 2243: [SDOI2011]染色 线段树区间合并+树链剖分
    codeforces gym 101164 K Cutting 字符串hash
    树链剖分求lca
    UESTC 1697 简单GCD问题(一) 筛法
  • 原文地址:https://www.cnblogs.com/knife-rose/p/15010274.html
Copyright © 2020-2023  润新知