zoukankan      html  css  js  c++  java
  • 卡特兰数和超级卡特兰数

    卡特兰数和超级卡特兰数


    这篇博客主要是想讲一下超级卡特兰数(大施罗德数),顺带就想讲一下卡特兰数.

    卡特兰数

    定义

    卡特兰数记为(C_n)
    (C_1=1)
    (forall n geq 2, C_n=sum_{i=1}^{n-1}C_i C_{n-i})

    前几项大概是: 1, 1, 2, 5, 14, 42, 132......

    直接递推未免效率太低,我们考虑用生成函数优化.
    显然有(C(x)=C(x)^2+x)
    解得(C(x)={1-(1-4x)^{frac 1 2}over 2})
    ((1-4x)^{frac 1 2})用广义二项式定理展开
    得到(C(x))(x^n)项系数为(frac 1 n inom {2n-2}{n-1})

    组合意义

    1.(n+1)边形的三角剖分方案数.
    注意到任意三角形一定是某一条边在多边形上,然后再选一个不是这条边的端点的点,而且注意到这样一个三角形不会被计算两次,所以会得到一个类似于卡特兰数的递推式.
    如果直接枚举一条边然后分成两边的话,是算不对的,因为可能一个点不与多边形上任意非相邻点连边.如果要强行这么算的话,那就得枚举所有的边然后除以算重的次数.

    2.(n)个数的连乘积,只用结合律(加括号)来改变乘法顺序,问有多少中乘法的顺序.
    考虑枚举最后是哪两个数相乘,不难发现是卡特兰数的形式.

    3.(n-1)对括号的括号序列的合法方案数.
    枚举第一个左括号所对应的右括号的位置即可.

    4.从(0,0)到(n-1,n-1),每次只能往右或往上走,求不超过(y=x)这条直线的方案数.
    考虑第一步肯定是往右边走,然后枚举第一个经过(y=x)这条直线的位置.
    另外一种思路,将条件变成不经过(y=x+1)这条直线,那么寻找(0,0)关于(y=x+1)的对称点
    (-1,1),显然每一条从(0,0)到(n-1,n-1)的不合法路径对应一条从(-1,1)到(n-1,n-1)的不合法路径.

    超级卡特兰数

    记超级卡特兰数为(S_i)
    (S_1=1)
    (forall i geq 2,S_i=S_{i-1}+sum_{i=1}^{n-1}S_iS_{n-i})

    写成生成函数的形式是(S(x)=xS(x)+S(x)^2+x)
    解得(S(x)={1-x - sqrt{x^2-6x+1} over 2})

    如果还是用广义二项式定理展开的话,经过复杂化简,可以得到(S_n=sum_{i=1}^n inom {n+i-1} {2i}C_i),后面我们可以看见,这个式子有着清晰的组合意义.

    不过网上还有一种(O(n))递推的方法,简而言之就是快速求出(sqrt{x^2-6x+1})

    接下来给出的一种方法,可以在(O(nk))的复杂度快速求出k次多项式开方后前n项的值
    设要开方的多项式为(P(x)),开方后的多项式为(F(x)).
    (F(x)=P(x)^{frac 1 2}=sum_{i=0}^{infty} f_i x^i)
    两边求导,可得(F'(x)=frac 12 P(x)^{-frac 12} P'(x))
    (F(x)P'(x)=F'(x)P(x))
    对比每一项系数,不难得到k+1项的递推式.

    最后给出递推公式:((n+1)f_{n+1}=(6n-3)f_n-(n-2)f_{n-1}),不过要注意这个递推公式除了第一项其他的项都是超级卡特兰数的(frac12)

    组合意义

    相比卡特兰数,超级卡特兰数的唯一区别就是在递推的时候加了一个(S_{n-1}),那么其组合意义也可以看做是卡特兰数的扩展.

    1.(n+1)边形的任意剖分方案数.
    还是考虑枚举一条多边形上的边,那么有可能这条边仍然与另一个点拉成一个三角形,也有可能这条边上没有,那么把这两种加起来就是定义的递推式

    2.括号序列,每个位置可能左括号,右括号和0.括号对数与0的个数之和为n-1, 问合法的括号序列数.
    同样枚举第一个是左括号还是0.
    值得一提的是,可以看成先插括号再插0,那么枚举括号对数i,0有n-i-1个,需要放入2i+1个位置中,那么不难得到上面通过广义二项式推出来的式子.

    3.从(0,0)到(n-1,n-1),每次能往右,往上,往右上走,求不超过(y=x)这条直线的方案数.
    枚举第一次是走右上还是走右.
    同样使用容斥思想,把答案转化为从(0,0)到(n-1,n-1)减去(-1,1)到(n-1,n-1).
    那么从(0,0)到(n,m)的路径条数怎么求呢.可以考虑枚举往右上的次数,然后还是考虑先走右和上,然后再把走右上的插入即可.











  • 相关阅读:
    INI配置文件的格式
    UserControl图片显示报错问题
    CornerRadius圆角属性
    Stretch属性
    [WPF]The type name ‘App’ does not exist in the type '...'的问题
    [Word]解决Word中执行输入操作时后面字符自动被删除的问题
    MATLAB中的取整函数(fix、round、floor、ceil)
    [数据库][C#]几个常用的正则表达式
    [数据库][C#]提取字符串中的数字
    springmvc注解知识点汇总
  • 原文地址:https://www.cnblogs.com/gzy-cjoier/p/10394016.html
Copyright © 2011-2022 走看看