「算法学习」斯特林数和斯特林反演

第二类斯特林数

第二类斯特林数:将 n 个不同元素划分为 k 个不区分的集合的方案数。表示为 {nk}S(n,k)

递推式:{nk}={n1k1}+k{n1k}。边界是 {n0}=[n=0]

通项:令划分成 i 个可为零的集合的方案数为 gi,没有空集的方案数为 fi,则 gi=j=0i(ij)fj,反演一下 fi=j=1i(1)ij(ij)gj=j=1i(1)ij(ij)nj。由于 {nk} 要求集合之间不区分,所以 {nk}=i=1k(1)ki  ini!(ki)!。(注意这里是 in 而不是 ni

同一行第二类斯特林数:用上面的通项卷积即可,时间复杂度 O(nlog2n)

同一列第二类斯特林数:


第一类斯特林数

第一类斯特林数:将 n 个不同元素划分为 k 个轮换的方案数。表示为 [nk]s(n,k)

递推式:[nk]=[n1k1]+(n1)[n1k],边界是 [n0]=[n=0]

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

同一行第一类斯特林数:类似第二类斯特林数,我们构造同行第一类斯特林数的生成函数,即 Fn(x)=i=0n[ni]xi。根据递推公式,Fn(x)=(n1)Fn1(x)+xFn1(x)=i=0n1(x+i)=(x+n1)!(x1)!。这其实是 xn 次阶乘幂,记作 xn。这个东西可以分治乘 O(nlog2n),也可以用上升幂相关做法 O(nlogn) 求出。

同一列第一类斯特林数:


斯特林反演

可以先回顾一下二项式反演,二项式反演的核心式子是 k=ji(1)kj(ik)(kj)=k=ji(1)kj(ij)(ijkj)=(ij)k=0ij(1)k(ijk)=(ij)k=0ij(1)k(ijk)=(ij)(11)ij=[i=j]

aij:=(ij)bij:=(1)ij(ij)cij:=k=0naikbkj=k=ji(1)kj(ik)(kj)=[i=j]

AB=C=I,所以 AF=GF=BG

所以 g(n)=i=0nanif(i)=i=0n(ni)f(i)f(n)=i=0nbnig(i)=i=0n(1)ni(ni)g(i)

同理,斯特林反演也有这样一个核心式子:
[i=j]=k=ji(1)ik[ik]{kj}

[i=j]=k=ji(1)ik{ik}[kj]

所以,斯特林反演的形式和二项式反演基本一致:

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

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

考虑证明这两个核心式子:


上升幂与普通幂,下降幂与普通幂

上升幂与普通幂的相互转化:我们记上升阶乘幂 xn=i=0n1(x+i)=(x+n1)!(x1)!

则可以利用下面的恒等式将上升幂转化为普通幂:xn=k=0n[nk]xk。(第一斯特林数的生成函数)

如果将普通幂转化为上升幂,其实反演一下就好了:xn=k=0n(1)nk{nk}xk

同理,将 x 换成 xxn=k=0n{nk}xk

反演一下,xn=k=0n(1)nk[nk]xk


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

其实就是稍微推推式子化成卷积。


例题

CountTables
fi 为所有行不相同的方案数,gi 为所有行和列都不相同的方案数。

fi=(Ci)m=j=0n{ij}gj

所以 gi=j=0n(1)nj[ij]fj=j=0n(1)nj[ij](Ci)m。答案即为 gn


「BZOJ4671」异或图
fi 为至少有 i 个连通块的方案数,gi 为恰好有 i 个连通块的方案数。

fi=j=in{ji}gjgi=j=in(1)ji[ji]fj

现在要求 fi。发现可以枚举拆分的情况,连通块之间的边异或和为 1,简单高斯消元判有无解求自由元即可。

时间复杂度:O(Bell(n)n4s/ω)


[国家集训队] Crash 的文明世界
套路幂和转下降幂。

j=1ndist(i,j)k=j=1nu=0k{ku}(dist(i,j)u)u!

由于 O(nk) 可过,设 f(i,j)i 子树内 (dist(i,u)j)。这个东西算二次递推即可。然后再做一次换根即可。


CF932E Team Work
Way 1:用上面那个 trick:幂转下降幂。然后组合数计算即可。

Way 2


posted @   Saintex  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示