学习笔记:斯特林数

斯特林数

第二类斯特林数

为什么先介绍第二类斯特林数?因为第一类没学 虽然被称作「第二类」,第二类斯特林数却在斯特林的相关著作和具体数学中被首先描述,同时也比第一类斯特林数常用得多。

第二类斯特林数(斯特林子集数){nk},也可记做 S(n,k),表示将 n 个两两不同的元素,划分为 k 个互不区分的非空子集的方案数。

递推式

{nk}={n1k1}+k{n1k}

边界是 {n0}=[n=0]

考虑用组合意义来证明。

我们插入一个新元素时,有两种方案:

  • 将新元素单独放入一个子集,有 {n1k1} 种方案;
  • 将新元素放入一个现有的非空子集,有 k{n1k} 种方案。

根据加法原理,将两式相加即可得到递推式。

通项公式

{nm}=i=0m(1)miini!(mi)!

使用容斥原理证明该公式。设将 n 个两两不同的元素,划分到 i 个两两不同的集合(允许空集)的方案数为 Gi,将 n 个两两不同的元素,划分到 i 个两两不同的非空集合(不允许空集)的方案数为 Fi

显然

Gi=inGi=j=0i(ij)Fj

根据二项式反演

Fi=j=0i(1)ij(ij)Gj=j=0i(1)ij(ij)jn=j=0ii!(1)ijjnj!(ij)!

考虑 Fi{ni} 的关系。第二类斯特林数要求集合之间互不区分,因此 Fi 正好就是 {ni}i! 倍。于是

{nm}=Fmm!=i=0m(1)miini!(mi)!

同一行第二类斯特林数的计算

「同一行」的第二类斯特林数指的是,有着不同的 i,相同的 n 的一系列 {ni}。求出同一行的所有第二类斯特林数,就是对 i=0..n 求出了将 n 个不同元素划分为 i 个非空集的方案数。

根据上面给出的通项公式,卷积计算即可。该做法的时间复杂度为 O(nlogn)

同一列第二类斯特林数的计算

「同一列」的第二类斯特林数指的是,有着不同的 i,相同的 k 的一系列 {ik}。求出同一列的所有第二类斯特林数,就是对 i=0..n 求出了将 i 个不同元素划分为 k 个非空集的方案数。

利用指数型生成函数计算。

一个盒子装 i 个物品且盒子非空的方案数是 [i>0]。我们可以写出它的指数型生成函数为 F(x)=i=1+xii!=ex1。经过之前的学习,我们明白 Fk(x) 就是 i 个有标号物品放到 k 个有标号盒子里的指数型生成函数,那么除掉 k! 就是 i 个有标号物品放到 k 个无标号盒子里的指数型生成函数。

{ik}=[xii!]Fk(x)k!O(nlogn) 计算多项式幂即可。

另外,expF(x)=i=0+Fi(x)i! 就是 i 个有标号物品放到任意多个无标号盒子里的指数型生成函数(EXP 通过每项除以一个 i! 去掉了盒子的标号)。这其实就是贝尔数的生成函数。

这里涉及到很多「有标号」「无标号」的内容,注意辨析。

第一类斯特林数

第一类斯特林数(斯特林轮换数)[nk],也可记做 s(n,k),表示将 n 个两两不同的元素,划分为 k 个互不区分的非空轮换的方案数。

一个轮换就是一个首尾相接的环形排列。我们可以写出一个轮换 [A,B,C,D],并且我们认为 [A,B,C,D]=[B,C,D,A]=[C,D,A,B]=[D,A,B,C],即,两个可以通过旋转而互相得到的轮换是等价的。注意,我们不认为两个可以通过翻转而相互得到的轮换等价,即 [A,B,C,D][D,C,B,A]

递推式

[nk]=[n1k1]+(n1)[n1k]

边界是 [n0]=[n=0]

该递推式的证明可以考虑其组合意义。

我们插入一个新元素时,有两种方案:

  • 将该新元素置于一个单独的轮换中,共有 [n1k1] 种方案;
  • 将该元素插入到任何一个现有的轮换中,共有 (n1)[n1k] 种方案。

根据加法原理,将两式相加即可得到递推式。

通项公式

第一类斯特林数没有实用的通项公式。

同一行第一类斯特林数的计算

类似第二类斯特林数,我们构造同行第一类斯特林数的生成函数,即

Fn(x)=i=0n[ni]xi

根据递推公式,不难写出

Fn(x)=(n1)Fn1(x)+xFn1(x)

于是

Fn(x)=i=0n1(x+i)=(x+n1)!(x1)!

这其实是 xn 次上升阶乘幂,记做 xn¯。这个东西自然是可以暴力分治乘 O(nlog2n) 求出的,但用上升幂相关做法可以 O(nlogn) 求出。

同一列第一类斯特林数的计算

仿照第二类斯特林数的计算,我们可以用指数型生成函数解决该问题。注意,由于递推公式和行有关,我们不能利用递推公式计算同列的第一类斯特林数。

显然,单个轮换的指数型生成函数为

F(x)=i=1n(i1)!xii!=i=1nxii

它的 k 次幂就是 [ik] 的指数型生成函数,O(nlogn) 计算即可。

第三类斯特林数

还没学懂,先鸽着。(其实本来就是贺的

应用

上升幂与普通幂的相互转化

我们记上升阶乘幂 xn¯=k=0n1(x+k)

则可以利用下面的恒等式将上升幂转化为普通幂:

xn¯=k[nk]xk

如果将普通幂转化为上升幂,则有下面的恒等式:

xn=k{nk}(1)nkxk¯

下降幂与普通幂的相互转化

我们记下降阶乘幂 xn_=x!(xn)!=k=0n1(xk)

则可以利用下面的恒等式将普通幂转化为下降幂:

xn=k{nk}xk_

如果将下降幂转化为普通幂,则有下面的恒等式:

xn_=k[nk](1)nkxk

多项式下降阶乘幂表示与多项式点值表示的关系

在这里,多项式的下降阶乘幂表示就是用

f(x)=i=0nbixi_

的形式表示一个多项式,而点值表示就是用 n+1 个点

(i,ai),i=0..n

来表示一个多项式。

显然,下降阶乘幂 b 和点值 a 间满足这样的关系:

ak=i=0nbiki_

ak=i=0nbik!(ki)!akk!=i=0kbi1(ki)!

这是一个卷积形式的式子,我们可以在 O(nlogn) 的时间复杂度内完成点值和下降阶乘幂的互相转化。

常规幂、上升幂、下降幂通过斯特林数完美的联系在了一起,可以用一张图来概括。

posted @   tsqtsqtsq  阅读(40)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示