zoukankan      html  css  js  c++  java
  • 特殊计数序列——第一类斯特林(stirling)数

    第一类斯特林数

    在这里我因为懒所以还是用(S(n,m))表示第一类斯特林数,但一定要和第二类斯特林数区分开来

    递推式

    (S(n,m)=S(n-1.m-1)+S(n-1,m)*(n-1))

    其中(S(0,0)=1,S(i,0)=0(i>0))

    组合意义

    (n)个元素组成(m)个圆排列的方案数

    注意这里圆排列指的是两个排列经过旋转能重合的算一种方案

    那么递推式就可以这样理解:对于当前的第(n)个元素,单独成一个圆排列有(S(n-1,m-1))种方案,放在其它的圆排列中有(S(n-1,m)*(n-1))种方案,即放在每个元素的左侧(右侧等价于另一个元素的左侧)

    性质

    1、(S(n,1)=(n-1)!)

    圆排列定义

    2、(sum_{i=1}^{n}S(n,i)=n!)

    我们知道(1-n)(n)个元素能形成(n!)个个排列,也就是(n!)个置换,而将置换写成循环的形式,这又对应着一个圆排列,于是就建立起了(n)排列和第一类斯特林数一一对应的关系

    3、(x^underline{n}=sum_{i=0}^nS(n.i)(-1)^{n-i}x^i)(x^overline{n}=sum_{i=0}^nS(n,i)x^i)

    证明的话考虑数学归纳法,这里仅给出第一条的证明

    [egin{aligned} x^{underline{n+1}}=&(x-n)x^{underline{n}}\ =&(x-n)sum_{i=0}^nS(n,i)(-1)^{n-i}x^i\ =&sum_{i=0}^nS(n,i)(-1)^{n-i}x^{i+1}-nsum_{i=0}^nS(n,i)(-1)^{n-i}x^i\ =&sum_{i=1}^{n+1}S(n,i-1)(-1)^{n-i+1}x^i+nsum_{i=0}^nS(n.i)(-1)^{n-i+1}x^i\ =&sum_{i=0}^{n}(S(n,i-1)+nS(n.i))(-1)^{n-i}x^i\ =&sum_{i=0}^{n}S(n+1,i)(-1)^{n-i}x^i end{aligned} ]

    求解第一类斯特林数

    最普通的方法就是(O(n^2))的递推啦,考虑有没有更优的方法

    我们先丢结论:

    [S(n,m)=[x^m]prod_{i=0}^{n-1}(x+i) ]

    计算右式的话可以使用分治+NTT在(O(nlog^2n))的时间内解决,但是这么做的理由是什么?

    设现在求的是(S(n,m))我们记(f_n(x)=prod_{i=0}^{n-1}(x+1)),然后把这个式子写成类似于递推的形式:

    [f_n(x)=(x+n-1)f_{n-1}(x)=xf_{n-1}(x)+(n-1)f_{n-1}(x) ]

    第一项(xf_{n-1}(x))就相当于(S(n-1,m-1)),第二项((n-1)f_{n-1}(x))就相当于((n-1)*S(n-1,m)),也就是说这个式子对应的递推式就是(S(n,m)=S(n-1,m-1)+(n-1)*S(n-1,m)),正确性也就显然了

  • 相关阅读:
    设计模式:访问者模式
    设计模式:模板模式
    三分法——求解凸性函数的极值问题——czyuan原创
    素数&&Miller_Rabbin
    【算法入门】深度优先搜索(DFS)
    快速幂取模
    hrbeu1280Turn the corner
    hdoj_3400Line belt
    【专题】三分法和牛顿迭代法总结
    zoj_3203Light Bulb
  • 原文地址:https://www.cnblogs.com/encodetalker/p/10780832.html
Copyright © 2011-2022 走看看