• 斯特林数


    斯特林数(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} ]

  • 相关阅读:
    Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别
    用foreach遍历 datagridView 指定列所有的内容
    treeView1.SelectedNode.Level
    YES NO 上一个 下一个
    正则 单词全字匹配查找 reg 边界查找 精确匹配 只匹配字符 不含连续的字符
    抓取2个字符串中间的字符串
    sqlite 60000行 插入到数据库只用不到2秒
    将多行文本以单行的格式保存起来 读和写 ini
    将秒转换成时间格式
    richtextbox Ctrl+V只粘贴纯文本格式
  • 原文地址:https://www.cnblogs.com/Wuweizheng/p/8638858.html
Copyright © 2020-2023  润新知