zoukankan      html  css  js  c++  java
  • 斯特林数

    斯特林数(Stirling)

    这篇写还行,阅读时要注意,里面有很多的错误

    5.6Stirling数

    当然,最详细的,在(ll)具体数学(gg)里面

    (一)第一类斯特林数[]

    1.定义

    记为 (S_{1}(n,k)) ,计算将 (n) 个元素排成 (k) 个轮换的方案数,其实也就是 (k) 个圆

    2.公式

    • (S_{1}(0,0)=1,S_{1}(n,0)=0)
    • (S_{1}(n,1)=(n-1)! , n>0) (有(n!)种排列,其中每一个元素都可以作为第一个元素)
    • (S_{1}(n,n)=1)
    • (S_{1}(n,n-1)=inom{n}{2})
    • (S_{1}(n,k)=(n-1)S_{1}(n-1,k)+S_{1}(n-1,k-1)),其中 (n>0)
      将最后一个元素放入前(n-1)个元素分成的 (S_{1}(n-1,k)) 个轮换中,有 (n-1) 种方法
      为了证明这一点,首先可以验证恰好有 (j) 种方式把一个新元素放进 (j) 轮换中形成一个 (j+1) 轮换 (一个有 (j) 个元素的圆中,共有 (j) 个间隙),那么只要对所有的 (k)(j) 求和,就可以得到有 (n-1) 种方式将第 (n) 个元素放入 (n-1) 个元素形成的 (k) 个轮换中
    • $sum_{k=0}^{n}S_{1}(n,k)=n! $
      因为排列与轮换安排一一对应,所以 (S1(n,k))(n) 个元素恰好包含 (k) 个轮换的排列的个数,如果对于所有的 (k) 求和 (S1(n,k)) ,必定可以得到排列总数 (n!)

    3.数值表

    第一类斯特林数

    (二)第二类斯特林数{}

    1.定义

    记为 (S_{2}(n,k)),表示将 (n) 个元素划分为 (k) 个非空子集的方案数

    2.公式

    • (S_{2}(n,0)=0),其中 (n>0),而(S_{2}(0,0)=1)

    • (S_{2}(n,1)=1),其中 (n>0),而(S_{2}(0,1)=0)

    • (S_{2}(n,2)=2^{n-1}-1),其中 (n>0),而(S_{2}(0,2)=0),对于每个数,有两种集合归属的情况,所以是 (2^n) ,去除掉两个全集的情况,就是 (2^n-2) ,又因为两个集合没有顺序的关系,所以要除以2

    • (S_{2}(n,k)=kS_{2}(n-1,k)+S_{2}(n-1,k-1)),其中 (n>0)
      最后一个元素可以自己单独一个集合,也可以与前面的某个非空子集放在一起,有 (k) 中放法

    • (S_{2}(n,n-1)=inom{n}{2})

    • (S_{2}(n,n)=1)

    • 然后还有一个很重要的式子:原因详见百度百科

      [m!S_{2}(n,m)=sum_{k=0}^{m}(-1)^kC(m,k)(m-k)^n ]

    (m!S_{2}(n,m)) 表示将(n)个不同的球放入(m)个编号不同的盒子中,使得没有一个盒子是空的的方案数。然后后面的式子就是一个组合数形式的容斥原理的简单应用。

    注意到这个式子是一个卷积的形式,所以我们可以利用NTT在(O(nlog n))的复杂度内,预处理出所有的(S(n,i),1leqslant i leqslant n)。为什么这个式子可以NTT呢?好像不太明显,我们把组合数拆开,原式化为:

    [S(n,m)=frac{1}{m!}sum_{k=0}^{m}(-1)^kfrac{m!}{k!(m-k)!}(m-k)^n ]

    整理一下,就可以变成:

    [S(n,m)=sum_{k=0}^{m}[frac{(-1)^k}{k!}] imes [frac{(m-k)^n}{(m-k)!}] ]

    这下子,卷积的形式就很明显了,于是我们也就可以用NTT实现了。

    code

    3.数值表

    第二类斯特林数

    (三)联系

    • 轮换数大于等于子集数,即 (S_{1}(n,k)geqslant S_{2}(n,k))(n,kgeqslant0)
    • (S_{1}(n,n)=S_{2}(n,n)=1)
    • (S_{1}(n,n-1)=S_{2}(n,n-1)=inom{n}{2})
    • (sum_{k=0}^{n}S_{1}(n,k)=n!) ,排列与轮换一一对应
    • 反转公式:(sum_{k}S_{1}(n,k)S_{2}(k,m)(-1)^{n-k}=[m=n])
    • 反转公式:(sum_{k}S_{2}(n,k)S_{1}(k,m)(-1)^{n-k}=[m=n])

    (四)应用

    1.上升幂与下降幂

    为了方便,我们定义

    (leftlceil x ight ceil_{n}=x(x+1)(x+2)...(x+n-1)) (上升幂)

    (leftlfloor x ight floor_{n}=x(x-1)(x-2)...(x-n+1)) (下降幂)

    那么,我们可以得到

    • (x^{n}=sum_{k=0}^{n}S_{2}(n,k)leftlfloor x ight floor_{k})(ngeqslant0)
    • (x^{n}=sum_{k=0}^{n}S_{2}(n,k)(-1)^{n-k}leftlceil x ight ceil_{k})(ngeqslant0)
    • (leftlceil x ight ceil_{n}=sum_{k=0}^{n}S_{1}(n,k)x^{k})(ngeqslant0)
    • (leftlfloor x ight floor_{n}=sum_{k=0}^{n}S_{1}(n,k)(-1)^{n-k}x^{k})(ngeqslant0)

    另外,再拓展一点,对于(leftlfloor x ight floor_{k})

    [leftlfloor x ight floor_{k}=x*(x-1)*...*(x-k+1) ]

    [=frac{x!}{(x-k)!}=C(x,k)*k! ]

    那么,对于第一个式子,我们可以得到

    [x^{n}=sum_{k=0}^{n}S_{2}(n,k)C(x,k)*k! ]

    (五)习题

    1.bzoj4555

    [f(n)=sum_{i=0}^{n}sum_{j=0}^{i}S_{2}(i,j)*2^{j}*(j!) ]

    解析:

    这道题目与上面的例题没有很大的区别,推导过程也很容易,只是要注意函数的预处理部分那些较小的值

    (六)附录

    关于反转公式的证明

    资料来自维基百科

    [P(n)=displaystyle sum_k left[{n atop k} ight] left{ {k atop m} ight} left({-1} ight)^{n - k} = delta_{m n} ]

    对于 (P(0)) 很显然

    (n geq 0) 时,假设我们已经证出

    [displaystyle forall j: 0 le j le r,displaystyle forall m in Z: sum_k left[{j atop k} ight] left{ {k atop m} ight} left({-1} ight)^{j - k} = delta_{m j} ]

    那么,就需要证明

    [displaystyle forall m in Z: sum_k left[{ {r + 1} atop k} ight] left{ {k atop m} ight} left({-1} ight)^{r + 1 - k} = delta_{m left({r + 1} ight)} ]

    证明:

    [egin{align} &=displaystyle sum_k left[{ {r + 1} atop k} ight] left{ {k atop m} ight} left({-1} ight)^{r + 1 - k} \ &=displaystyle sum_k left({left[{r atop k - 1} ight] + r left[{r atop k} ight]} ight) left{ {k atop m} ight} left({-1} ight)^{r + 1 - k}\ &=displaystyle sum_k left[{r atop k - 1} ight] left{ {k atop m} ight} left({-1} ight)^{r + 1 - k} - r sum_k left[{r atop k} ight] left{ {k atop m} ight} left({-1} ight)^{r - k}\ &=displaystyle sum_k left[{r atop k - 1} ight] left{ {k atop m} ight} left({-1} ight)^{r + 1 - k} - r delta_{m r}\ &=displaystyle sum_k left[{r atop k - 1} ight] left({left{ {k - 1 atop m - 1} ight} + m left{ {k - 1 atop m} ight} } ight) left({-1} ight)^{r + 1 - k} - r delta_{r m}\ &=displaystyle sum_k left[{r atop k - 1} ight] left{ {k - 1 atop m - 1} ight} left({-1} ight)^{r - left({k - 1} ight)}\ &+ m sum_k left[{r atop k - 1} ight] left{ {k - 1 atop m} ight} left({-1} ight)^{r - left({k - 1} ight)} - r delta_{r m}\ &=displaystyle delta_{r left({m - 1} ight)} + m delta_{r m} - r delta_{r m}\ &=displaystyle delta_{m left({r + 1} ight)} + left({m - r} ight) delta_{r m}\ &=displaystyle delta_{m left({r + 1} ight)}\ end{align}]

    所以

    [displaystyle forall m, n in Z: sum_k left[{n atop k} ight] left{ {k atop m} ight} left({-1} ight)^{n - k} = delta_{m n} ]

  • 相关阅读:
    c# linq 实现 m选n 组合
    asp.net web forms 部署到 centos mono 总结
    asp.net webform entityframework 部署到 centos mono
    css 固定表头
    asp.net webforms 用户自定义控件验证
    C#创建编译时动态属性对象和运行时动态属性对象(linq 动态列名)
    monodevelop 在 linux 安装后 debug 报错 Debugger operation failed
    c# winform 在新的应用程序域运行 wpf
    c# 图像压缩
    java 图像压缩
  • 原文地址:https://www.cnblogs.com/Wuweizheng/p/8638858.html
Copyright © 2011-2022 走看看