斯特林数 学习笔记

斯特林数

第一类斯特林数

第一类斯特林数 [nm] 表示将 n 个有标号元素划分成 m 个无标号圆排列的方案数。

递推式

考虑每次新加入一个元素,它可以单独成为一个环,或者接到任意一个元素后面,有:

[nm]=[n1m1]+(n1)[n1m]

恒等式

  • i=0n[ni]=n!,众所周知排列由若干个圆排列构成。
  • xn=i=0n[ni]xi,上升幂转普通幂公式,这同时指出一行第一类斯特林数的 OGF 为 xn

生成函数

从组合意义的角度推导第一类斯特林数的生成函数 F(x)=i0j0xii!yj[ij],注意 x 这一维上是 EGF。

首先,单个环的生成函数是 yi=1n(i1)!xii!=yln(1x),多个无标号环的组合就是 exp(yln(1x))=(1x)y

求一行第一类斯特林数

一行第一类斯特林数的生成函数为 xn,考虑如何快速求出 xn,可以分治 FFT 得到一个 O(nlog2n) 算法,下面介绍一种 O(nlogn) 的算法。

仍然考虑和分治类似的思路:倍增。考虑设 Fi(x)=xn,问题有两个:

  • 根据 Fi(x) 得到 F2i(x),发现 F2i(x)=Fi(x)Fi(x+i),利用多项式平移做到 O(nlogn)
  • 根据 Fi(x) 得到 Fi+1(x),暴力卷上一项是线性的。

事实证明,倍增在求多项式幂上是比分治更为优秀的结构。

求一列第一类斯特林数

考虑生成函数,有 [ym]exp(yln(1x))=(ln(1x))mm!,使用多项式快速幂可以做到 O(nlogn)

cmd 提到了一种小常数做法,但是不想学。不过 i=1n(1ix)i=1n(xi) 的翻转,把 DP 式子写出来转化一下定义就可以发现了。

第二类斯特林数

第二类斯特林数 {nm} 表示将 n 个有标号元素划分成 m 个非空无标号集合的方案数。

递推式

考虑每个元素,要么加入前面的一个集合,要么新建一个集合,有:

{nm}={n1m1}+m{n1m}

对比第一类斯特林数的递推式,不同的只有后面一项的系数。

恒等式

  • xn=i=0n{ni}xi,普通幂转下降幂公式。
  • {nm}m!=i=0m(mi)(1)miin,通项公式。可以利用容斥解释,也可以对上面二项式反演。

生成函数

从组合意义的角度推导第二类斯特林数的生成函数 F(x)=i0j0xii!yj{ij},注意 x 这一维上是 EGF。

考虑单个集合的生成函数为 y(ex1),多个集合就是 exp(y(ex1))

求一行第二类斯特林数

通项公式就是卷积形式。

求一列第二类斯特林数

考虑 [ym]exp(y(ex1))=(ex1)mm!,使用多项式快速幂即可。

斯特林反演

有斯特林反演公式:

fn=i=0n[ni]gign=i=0n{ni}(1)nifi

因为题目太少了,目前只知道可以钦定一些元素在一些等价类中,然后容斥。

上述式子也指出了下降幂转普通幂和普通幂转上升幂的公式:

xn=i=0n[ni](1)nixixn=i=0n{ni}(1)nixi

没做过题,不会用。

习题

CF960G

考虑只有前缀最大值的限制怎么做,考虑一个 DP。设 fi,j 表示前 i 个有 j 个最大值的方案数:

fi,j=fi1,j1+jfi1,j

这就是第一类斯特林数,所以有 a 个前缀最大值方案数是 [na]

考虑原问题。发现前缀最大值和后缀最大值之间相互独立,枚举最大值位置:

i=1n[i1a1][nib1](n1i1)=(a+b2a1)[n1a+b2]

组合意义不难证明。

但是发现第一类斯特林数没有通项公式,所以只能写多项式。

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