除了组合数、卡特兰数之外,最重要的一类特殊数便是斯特林数。
1.1 第二类斯特林数#
斯特林数通常有两种,分别为第一类斯特林数和第二类斯特林数,后者通常更为重要。
与组合数类似,第二类斯特林数也有自己的符号 {n m},其含义为把 n 个不同的数划分到 m 个非空集合中的方案数。
我们首先从递推的角度考虑怎么计算第二类斯特林数,我们考虑第 n 个数的划分情况:
- 单独分到一个集合,{n−1m−1}。
- 加入某个集合,m{n−1 m}。
那么我们得到 {n m}={n−1 m−1}+m{n−1 m}。
于是可以得到 Θ(n2) 的递推公式。
那么,第二类斯特林数有没有通项公式呢?
首先,因为集合之间没有区别,我们不妨让集合也有区别,这样方案数就变成了 m!{nm}。
另一方面,我们要求所有集合非空,那么可以考虑容斥, 钦定若干集合为空的,剩下的任意。
那么可以得到一个计算式:
m!{nm}=m∑i=0(mi)(−1)i(m−i)n
这样便可以得到第二类斯特林数的通项公式,只不过求单个只能 Θ(m)。
另一方面,我们有下面这个式子:
mn=m∑i=0(mi){ni}i!
其含义为,左边为把 n 个不同的球装进 m 个不同的盒子里的方案数,右边是枚举非空的盒子数量,然后乘上第二类斯特林数,并且因为盒子不同,要再乘上 i!。
更进一步的,上面的式子可以看成下面的式子做二项式反演得到的。
同时,因为 (mi)i!=mi–,且 i 要 ≤n 才有意义,所以上式可以改写为:
xn=n∑i=0{ni}xi–
这样我们就得到了把普通幂转化为下降幂的方法。
自然数幂和问题#
给定 n,m,求 n∑i=0im。
n∑i=0im=n∑i=0m∑j=0{mj}ij–
=m∑j=0{mj}n∑i=0ij–
下降幂和组合数的性质很相近啊,我们不妨用上指标求和推一推:
n∑i=0ik––=k!n∑i=0(ik)=k!(n+1k+1)=k!(n+1)!(k+1)!(n−k)!=(n+1)k+1–––––k+1
那么原式等于:
=(n+1)m∑j=0{mj}njj+1
复杂度 Θ(m2),瓶颈在于预处理第二类斯特林数。
n∑i=0(ni)im=m∑j=0{mj}n∑i=0(ni)ij–
=m∑j=0{mj}j!n∑i=0(ni)(ij)
=m∑j=0{mj}j!(nj)n−j∑i=0(n−ji−j)
=m∑j=0{mj}j!(nj)2n−j
复杂度 Θ(m2)。
n∑k=0m∑j=0fjkjxk(nk)
m∑j=0fjn∑k=0j∑p=0{jp}kp–xk(nk)
m∑j=0fjj∑p=0{jp}p!n∑k=0(kp)(nk)xk
m∑j=0fjj∑p=0{jp}p!(np)n∑k=0(n−pk−p)xk
m∑j=0fjj∑p=0{jp}p!(np)n−p∑k=0(n−pk)xk+p
m∑j=0fjj∑p=0{jp}p!(np)xpn−p∑k=0(n−pk)xk
m∑j=0fjj∑p=0{jp}p!(np)xp(1+x)n−p
复杂度 Θ(m2)。
此外有很多题是根据组合数的组合意义进行优化。
ansx=n∑i=1dis(i,x)k=n∑i=1k∑j=0{kj}j!(dis(i,x)j)=k∑j=0{kj}j!n∑i=1(dis(i,x)j)
考虑组合意义,在所有点到 x 的路径上选了 j 条边的方案数之和,那么容易设计一个 dp,fx,i 为 x 子树内,所有路径上选出 i 条边的方案数之和,转移是容易的。
之后只需要换根 DP 求出每个点的答案就行,复杂度 Θ(nk)。
1.2 第一类斯特林数#
第一类斯特林数被表示为 [nm],其含义为把 n 个不同元素扔到 m 个环上的方案数,即有 m 个置换环的 n 元排列个数。
与之前类似,我们还是考虑新加入一个元素,也是有两种情况:
- 单独构成一个环,[n−1m−1]
- 插入之前的某个元素后面,(n−1)[n−1m]
于是也得到了 Θ(n2) 的递推公式。
模板题,按照组合意义推即可。
1.3 斯特林反演#
与下降幂类似,我们定义上升幂 x¯¯¯n=n−1∏i=0(x+i),那么就有如下两个公式:
证明比较复杂且不太重要。
结合前面的我们一共有四个高度相似的公式:
-
xn=n∑i=0{ni}xi–
-
xn=n∑i=0(−1)i{ni}x¯i
-
x¯¯¯n=n∑i=0[ni]xi
-
xn––=n∑i=0(−1)i[ni]xi
这个公式也很好记,我们认为上升幂>普通幂>下降幂,那么:
- 从两边(上升幂,下降幂)到中间(普通幂)用第二类斯特林数,从中间到两边用第一类斯特林数。
- 从小的到大的要带 (−1)i,从大的到小的不需要。
此外还有 斯特林反演 公式:
f(n)=n∑i=0{ni}g(i)⇔g(n)=n∑i=0(−1)i[ni]f(i)
我们钦定出 i 个连通块,满足连通块之间没边,连通块内部随意,这样子的方案数是 gi。
如果恰好有 i 个连通块的方案数是 fi,那么考虑 f 与 g 的关系,因为 g 的每个连通块实际可能是由若干连通块构成的,那么就是把 f 的若干连通块分到一个 g 的连通块里,这个方案数就是第二类斯特林数。
gi=n∑j=i{ji}fj⇔fi=n∑j=i(−1)j−i[ji]gj
最终求的就是 f1,因此我们需要求出 g1,g2…gn。
直接枚举钦定出来的连通块,这个复杂度是 n的贝尔数 ,那么限制就是连通块之间每条边的出现次数是偶数。我们可以列出一些关于图是否选择的异或方程,那么求出线性基之后这个方案数就是 2 的自由元个数次方。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】