[学习笔记]浅析 第二类斯特林(Stirling)数 的妙用

一、概念及递推

第二类斯特林数:把 n 个元素分成 m 非空无序集合的方案数,记作

{ n m }

递推式:考察第 n 个元素是否单独属于一个集合。
如果单独属于一个集合,那么剩下的 n 1 个元素有 { n 1 m 1 } 中划分方法。
如果不单独属于一个集合,那么剩下的 n 1 个元素有 { n 1 m } 种划分方法,第 n 个元素可以插入这 m 个集合中的任一。
所以得出第二类斯特林数的递推式:
{ n m } = { n 1 m 1 } + m × { n 1 m }

边界 { 0 0 } = 1

二、通项公式

可以用容斥的方法求第二类斯特林数。
先考虑无序转有序,设 T ( n , m ) 表示把 n 个元素划分成 m 个非空有序集合的方案数。
注意这里「有序」的概念:集合的顺序有序,而集合内的元素无序。
{ 1 , 3 } { 2 , 4 , 5 } { 3 , 1 } { 5 , 4 , 2 } 是同一种方案,
{ 1 , 3 } { 2 , 4 , 5 } { 2 , 4 , 5 } { 1 , 3 } 不是同一方案。
这时候有:

{ n m } = T ( n , m ) m !

还是不 好求,考虑能否去掉「非空」这个条件。
如果不要求「非空」,那么可以把问题成对于每个元素,都为这个元素选取一个它所属的集合。方案数为:
m n

再加上「非空」这一条件,可以考虑容斥,枚举 { 1 , 2 , . . . , m } 的一个子集 S ,强制 S 内所有元素对应的集合全部为空。根据容斥原理,
T ( n , m ) = S { 1 , 2 , . . . m } ( 1 ) | S | × ( m | S | ) n

利用上组合数,把枚举 S 改为枚举 | S |
T ( n , m ) = i = 0 m ( 1 ) i × ( m i ) n × ( m i )


{ n m } = 1 m ! i = 0 m ( 1 ) i × ( m i ) n × ( m i )

三、形如 n m 的式子的分解

先给出公式:

n m = i = 0 { m i } × ( n i ) × i !

可以从组合数学的角度分析。
首先, { m i } × i ! = T ( m , i )
n m = i = 0 T ( m , i ) × ( n i )

这就是在 n 个集合中选出一些集合,用 m 个元素填充选出的集合, 使得被选出的集合不得为空。换一种想法,是在 n 个集合中,先指定一部分集合必须为空,剩下的集合必须非空,并用 m 个元素填充 指定非空的集合
进一步进行转化——用 m 个元素填充 n 个集合, 集合空或非空都行的方案数。
因此方案数为 n m

四、应用

给定一个 n 个点 m 条边的 DAG 和参数 k , 定义一条经过 l 条边的路径的权值为 l k 。 对于 1 i n , 求出所有 1 i 的路径的权值之和,对 998244353 取模。 1 n 10 5 1 m 2 × 10 5 0 k 500
显然拓扑排序,但直接求解有些困难,不妨转化下 l k

l k = i = 0 k { k i } × ( l i ) × i !

看到 0 k 500 的范围,将每个 i 分开考虑。
定义 f [ u ] [ i ] 表示从 1 u 的所有路径的 ( i ) 之和。
根据组合数的递推公式,可以得出转移:对于一条边 < u , v >
f [ v ] [ i ] + = f [ u ] [ i ] + f [ u ] [ i 1 ]

1 u 的路径权值和就是:
i = 0 k { k i } × i ! × f [ u ] [ i ]

五、In A Word

第二类斯特林数的妙用就是转换形如 n m 的式子。

猜你喜欢

转载自blog.csdn.net/xyz32768/article/details/80818366