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)),正确性也就显然了

  • 相关阅读:
    路由器设置无线网的方法
    numpy, pandas, matplotlib等常用库的学习手册
    文本乱码的解决办法
    漫画:SOA中怎样确定服务的粒度?
    漫画:大公司都在重复造轮子吗?
    演讲稿:新人培养之道
    漫画:全面理解java.lang.IllegalArgumentException及其可用性设计
    漫画:性能、可用性和锁
    漫画:Linux中/etc/resolv.conf文件和puppet工具解析
    《两地书》--Kubernetes(K8s)基础知识(docker容器技术)
  • 原文地址:https://www.cnblogs.com/encodetalker/p/10780832.html
Copyright © 2011-2022 走看看