【3】斯特林数

除了组合数、卡特兰数之外,最重要的一类特殊数便是斯特林数。

1.1 第二类斯特林数#

斯特林数通常有两种,分别为第一类斯特林数和第二类斯特林数,后者通常更为重要。

与组合数类似,第二类斯特林数也有自己的符号 {n m},其含义为把 n 个不同的数划分到 m 个非空集合中的方案数。

我们首先从递推的角度考虑怎么计算第二类斯特林数,我们考虑第 n 个数的划分情况:

  • 单独分到一个集合,{n1m1}
  • 加入某个集合,m{n1 m}

那么我们得到 {n m}={n1 m1}+m{n1 m}

于是可以得到 Θ(n2) 的递推公式。

那么,第二类斯特林数有没有通项公式呢?

首先,因为集合之间没有区别,我们不妨让集合也有区别,这样方案数就变成了 m!{nm}

另一方面,我们要求所有集合非空,那么可以考虑容斥, 钦定若干集合为空的,剩下的任意。

那么可以得到一个计算式:

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

这样便可以得到第二类斯特林数的通项公式,只不过求单个只能 Θ(m)

另一方面,我们有下面这个式子:

mn=i=0m(mi){ni}i!

其含义为,左边为把 n 个不同的球装进 m 个不同的盒子里的方案数,右边是枚举非空的盒子数量,然后乘上第二类斯特林数,并且因为盒子不同,要再乘上 i!

更进一步的,上面的式子可以看成下面的式子做二项式反演得到的。

同时,因为 (mi)i!=mi_,且 in 才有意义,所以上式可以改写为:

xn=i=0n{ni}xi_

这样我们就得到了把普通幂转化为下降幂的方法。

自然数幂和问题#

给定 n,m,求 i=0nim

i=0nim=i=0nj=0m{mj}ij_

=j=0m{mj}i=0nij_

下降幂和组合数的性质很相近啊,我们不妨用上指标求和推一推:

i=0nik_=k!i=0n(ik)=k!(n+1k+1)=k!(n+1)!(k+1)!(nk)!=(n+1)k+1_k+1

那么原式等于:

=(n+1)j=0m{mj}njj+1

复杂度 Θ(m2),瓶颈在于预处理第二类斯特林数。

CF932E Team Work#

i=0n(ni)im=j=0m{mj}i=0n(ni)ij_

=j=0m{mj}j!i=0n(ni)(ij)

=j=0m{mj}j!(nj)i=0nj(njij)

=j=0m{mj}j!(nj)2nj

复杂度 Θ(m2)

[省选联考 2020 A 卷] 组合数问题#

k=0nj=0mfjkjxk(nk)

j=0mfjk=0np=0j{jp}kp_xk(nk)

j=0mfjp=0j{jp}p!k=0n(kp)(nk)xk

j=0mfjp=0j{jp}p!(np)k=0n(npkp)xk

j=0mfjp=0j{jp}p!(np)k=0np(npk)xk+p

j=0mfjp=0j{jp}p!(np)xpk=0np(npk)xk

j=0mfjp=0j{jp}p!(np)xp(1+x)np

复杂度 Θ(m2)

练习一 CF1278F Cards#

此外有很多题是根据组合数的组合意义进行优化。

P4827 [国家集训队] Crash 的文明世界#

ansx=i=1ndis(i,x)k=i=1nj=0k{kj}j!(dis(i,x)j)=j=0k{kj}j!i=1n(dis(i,x)j)

考虑组合意义,在所有点到 x 的路径上选了 j 条边的方案数之和,那么容易设计一个 dp,fx,ix 子树内,所有路径上选出 i 条边的方案数之和,转移是容易的。

之后只需要换根 DP 求出每个点的答案就行,复杂度 Θ(nk)

练习二 P8362 [SNOI2022] 数位#

1.2 第一类斯特林数#

第一类斯特林数被表示为 [nm],其含义为把 n 个不同元素扔到 m 个环上的方案数,即有 m 个置换环的 n 元排列个数。

与之前类似,我们还是考虑新加入一个元素,也是有两种情况:

  • 单独构成一个环,[n1m1]
  • 插入之前的某个元素后面,(n1)[n1m]

于是也得到了 Θ(n2) 的递推公式。

[FJOI2016] 建筑师#

模板题,按照组合意义推即可。

1.3 斯特林反演#

与下降幂类似,我们定义上升幂 xn¯=i=0n1(x+i),那么就有如下两个公式:

  • xn¯=i=0n[ni]xi

  • xn_=i=0n(1)i[ni]xi

证明比较复杂且不太重要。

结合前面的我们一共有四个高度相似的公式:

  • xn=i=0n{ni}xi_

  • xn=i=0n(1)i{ni}xi¯

  • xn¯=i=0n[ni]xi

  • xn_=i=0n(1)i[ni]xi

这个公式也很好记,我们认为上升幂>普通幂>下降幂,那么:

  • 从两边(上升幂,下降幂)到中间(普通幂)用第二类斯特林数,从中间到两边用第一类斯特林数。
  • 从小的到大的要带 (1)i,从大的到小的不需要。

此外还有 斯特林反演 公式:

f(n)=i=0n{ni}g(i)g(n)=i=0n(1)i[ni]f(i)

P10591 BZOJ4671 异或图#

我们钦定出 i 个连通块,满足连通块之间没边,连通块内部随意,这样子的方案数是 gi

如果恰好有 i 个连通块的方案数是 fi,那么考虑 fg 的关系,因为 g 的每个连通块实际可能是由若干连通块构成的,那么就是把 f 的若干连通块分到一个 g 的连通块里,这个方案数就是第二类斯特林数。

gi=j=in{ji}fjfi=j=in(1)ji[ji]gj

最终求的就是 f1,因此我们需要求出 g1,g2gn

直接枚举钦定出来的连通块,这个复杂度是 n的贝尔数 ,那么限制就是连通块之间每条边的出现次数是偶数。我们可以列出一些关于图是否选择的异或方程,那么求出线性基之后这个方案数就是 2 的自由元个数次方。

综合题目 CF961G Partitions#

更综合的题目 [ARC138E] Decreasing Subsequence#

posted @   Larunatrecy  阅读(105)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
主题色彩