首先我们先来了解什么叫做斯特林数。
第一类斯特林数#
[ n m ] [ n m ] 或者 s ( n , m ) s ( n , m ) 表示从 n n 个元素中选出 m m 个圆排列的方案数。
什么是圆排列,对于两个排列,如果循环相同,那么这两个排列就被视为相同的圆排列,不难发现,n n 个元素的圆排列个数为 ( n − 1 ) ! ( n − 1 ) ! 。
递推式#
考虑递推斯特林数。我们考虑第 n n 个元素放在哪个圆排列中,首先是考虑新放一个圆排列,这样的方案数为 s ( n − 1 , m − 1 ) s ( n − 1 , m − 1 ) ,考虑把第 n n 个元素放进之前的某个圆排列中,不难发现,把一个元素放入一个 4 4 个元素的圆排列中有 4 4 种放法,所以我们把第 n n 个元素放在之前的某个圆排列中一共有 n − 1 n − 1 中放法,由此可以得到这样一个式子:
[ n m ] = [ n − 1 m − 1 ] + ( n − 1 ) [ n − 1 m ] [ n m ] = [ n − 1 m − 1 ] + ( n − 1 ) [ n − 1 m ]
这就是第一类斯特林数的递推式。
递推边界:s ( n , n ) = 1 ( n ≥ 0 ) , s ( n , 0 ) = 0 ( n ≥ 1 ) s ( n , n ) = 1 ( n ≥ 0 ) , s ( n , 0 ) = 0 ( n ≥ 1 )
s ( n , 1 ) = ( n − 1 ) ! s ( n , 1 ) = ( n − 1 ) !
由 n n 个元素的圆排列个数为 ( n − 1 ) ! ( n − 1 ) ! 可以得到。
s ( n , n − 1 ) = ( n 2 ) s ( n , n − 1 ) = ( n 2 )
让 n n 个元素组成 n − 1 n − 1 个圆排列,实际上是从这 n n 个元素里面选出来两个组成一个大小为 2 2 的圆排列,其余元素单独组成员排列。由此可知,性质成立。
s ( n , 2 ) = ( n − 1 ) ! ∑ n − 1 i = 1 1 i s ( n , 2 ) = ( n − 1 ) ! ∑ i = 1 n − 1 1 i
首先我们考虑设第一个圆排列的元素个数为 i i ,第二个圆排列的元素个数为 n − i n − i ,那么根据 s ( n , 1 ) = ( n − 1 ) ! s ( n , 1 ) = ( n − 1 ) ! 我们可以得到 ( n i ) ( i − 1 ) ! ( n − i − 1 ) ! ( n i ) ( i − 1 ) ! ( n − i − 1 ) ! ,同时我们需要注意到,因为在第一类斯特林数的定义中圆排列相互之间是没有顺序的,但是我们在计数的过程中却区分了第一个圆排列,第二个圆排列,所以我们算重了 2 2 遍,由此我们可以得到:
s ( n , 2 ) = n − 1 ∑ i = 1 ( n i ) ( i − 1 ) ! ( n − i − 1 ) ! 2 = n − 1 ∑ i = 1 1 2 n ! i ! ( n − i ) ! × ( i − 1 ) ! × ( n − i − 1 ) ! = n − 1 ∑ i = 1 1 2 n ! i ( n − i ) = ( n − 1 ) ! n − 1 ∑ i = 1 1 2 ( 1 i + 1 n − i ) s ( n , 2 ) = ∑ i = 1 n − 1 ( n i ) ( i − 1 ) ! ( n − i − 1 ) ! 2 = ∑ i = 1 n − 1 1 2 n ! i ! ( n − i ) ! × ( i − 1 ) ! × ( n − i − 1 ) ! = ∑ i = 1 n − 1 1 2 n ! i ( n − i ) = ( n − 1 ) ! ∑ i = 1 n − 1 1 2 ( 1 i + 1 n − i )
容易发现 1 i 1 i 与 1 n − i 1 n − i 的贡献相同,所以原式得证。
s ( n , n − 2 ) = 2 × ( n 3 ) + 3 × ( n 4 ) s ( n , n − 2 ) = 2 × ( n 3 ) + 3 × ( n 4 )
我们分两种情况讨论:第一种情况,我们把 n − 3 n − 3 个元素分给 n − 3 n − 3 个圆排列,其余 3 3 个元素自成一个排列,这样的方案数为 2 × ( n 3 ) 2 × ( n 3 ) ,前者是 3 3 元素圆排列个数,后者是从 n n 个元素中选出三个当圆排列。
第二种情况,我们把 n − 4 n − 4 个元素分给 n − 4 n − 4 个圆排列,然后剩下两个圆排列每个圆排列两个元素,首先 ( n 4 ) ( n 4 ) 选出 4 4 个元素,然后再 ( 4 2 ) ( 4 2 ) 选出两个元素给第一个圆排列,考虑到我们又给排列定了顺序,所以乘上 1 2 1 2 。由此可以得到原式。
∑ n k = 0 s ( n , k ) n k = n ! ∑ k = 0 n s ( n , k ) n k = n !
通过下文中的第一类斯特林数的生成函数可以得到这个性质。
第一类斯特林数分为有符号斯特林数和无符号斯特林数,有符号斯特林数通常表示为 s s s s ,无符号斯特林数通常表示为 s u s u ,我们有 s s ( n , k ) = ( − 1 ) n − k s u ( n , k ) s s ( n , k ) = ( − 1 ) n − k s u ( n , k ) ,在本文中,若无特殊说明,第一类斯特林数通常都指的是无符号斯特林数。
第二类斯特林数#
{ n m } { n m } 或 S ( n , m ) S ( n , m ) 表示把 n n 个元素划分成 m m 个非空集合的方案数,其中 m m 个集合两两相同。
通项公式#
我们考虑容斥来计算第二类斯特林数的通项公式,首先不管两个限制:非空和集合两两相同。
我们钦定有 i i 个集合是空的,然后把所有的球随意的放进剩下的盒子,这里盒子两两不同,这样的方案数应该为 ( n i ) ( m − i ) n ( n i ) ( m − i ) n ,然后我们容斥一下,就可以得到非空的方案数,再乘上 1 m ! 1 m ! 就可以得到盒子两两相同的方案数。由此,我们可以得到:
{ n m } = 1 m ! m ∑ i = 0 ( − 1 ) i ( m i ) ( m − i ) n { n m } = 1 m ! ∑ i = 0 m ( − 1 ) i ( m i ) ( m − i ) n
递推式#
我们一样考虑第 n n 个元素怎么放。
第一种情况,把第 n n 个元素放在最后一个盒子里,其余的元素放在其他的盒子里,这样的方案数为 S ( n − 1 , m − 1 ) S ( n − 1 , m − 1 ) 。第二种情况,把第 n n 个元素和其他元素放在一起,注意这里元素两两不同而盒子两两相同,所以说我们关注的是元素的组合情况,对于每一种方案,我们把第 n n 个元素加入一个新的组合都会产生一种情况,所以方案数为 m S ( n − 1 , m ) m S ( n − 1 , m ) ,由此,我们可以得到 S ( n , m ) = S ( n − 1 , m − 1 ) + m S ( n − 1 , m ) S ( n , m ) = S ( n − 1 , m − 1 ) + m S ( n − 1 , m ) 。
边界条件:S ( n , n ) = 1 ( n ≥ 0 ) , S ( n , 0 ) = 0 ( n > 1 ) S ( n , n ) = 1 ( n ≥ 0 ) , S ( n , 0 ) = 0 ( n > 1 ) 。
根据第二类斯特林数的定义不难的出这个结论。
S ( n , 2 ) = 2 n − 1 − 1 S ( n , 2 ) = 2 n − 1 − 1
两个集合我们考虑第一个集合放哪些数,这样的计数结果为 ∑ n − 1 i = 1 ( n i ) ∑ i = 1 n − 1 ( n i ) ,考虑到我们给集合定顺序但集合间并没有顺序,所以我们算重了两边,最终结果为:
1 2 n − 1 ∑ i = 1 ( n i ) = 1 2 ( 2 n − 2 ) = 2 n − 1 − 1 1 2 ∑ i = 1 n − 1 ( n i ) = 1 2 ( 2 n − 2 ) = 2 n − 1 − 1
S ( n , n − 1 ) = ( n 2 ) S ( n , n − 1 ) = ( n 2 )
不难想到这个东西实际上是从 n n 个元素中选出 2 2 个放到一个集合里去,由此可以得到上面这个式子。
{ n m } ≡ 0 mod n { n m } ≡ 0 mod n 当 n n 是质数且 1 < m < n 1 < m < n 时成立。
证明:
当 n n 是质数且 1 < m < n 1 < m < n 时,我们可以得到:
{ n m } = 1 m ! m ∑ i = 0 ( − 1 ) i ( m i ) ( m − i ) n = m ∑ i = 0 ( − 1 ) i ( m − i ) n i ! ( m − i ) ! ≡ m ∑ i = 0 ( − 1 ) i m − i i ! ( m − i ) ! { n m } = 1 m ! ∑ i = 0 m ( − 1 ) i ( m i ) ( m − i ) n = ∑ i = 0 m ( − 1 ) i ( m − i ) n i ! ( m − i ) ! ≡ ∑ i = 0 m ( − 1 ) i m − i i ! ( m − i ) !
我们对上面这个东西建立生成函数:
F ( x ) = ∑ m ≥ 0 ( m ∑ i = 0 ( − 1 ) i m − i i ! ( m − i ) ! ) x m F ( x ) = ∑ m ≥ 0 ( ∑ i = 0 m ( − 1 ) i m − i i ! ( m − i ) ! ) x m
发现这个东西是由两个生成函数卷积得到:
F ( x ) = ( ∑ i ≥ 0 ( − 1 ) i i ! x i ) × ( ∑ i ≥ 0 i i ! x i ) F ( x ) = ( ∑ i ≥ 0 ( − 1 ) i i ! x i ) × ( ∑ i ≥ 0 i i ! x i )
发现这个是因为关注到 F ( x ) F ( x ) 的系数本身就是一个卷积形式。
发现前面这个东西的封闭形式是 e − x e − x ,证明可以通过写出 e − x e − x 在原点处的泰勒展开得到。
而后面那个式子,不难发现 i = 0 i = 0 时式子值为 0 0 ,所以能够得到:
∑ i ≥ 0 i i ! x i = ∑ i ≥ 1 i i ! x i = ∑ i ≥ 1 1 ( i − 1 ) ! x i = ∑ i ≥ 0 x i + 1 i ! = x ∑ i ≥ 0 x i i ! = x e x ∑ i ≥ 0 i i ! x i = ∑ i ≥ 1 i i ! x i = ∑ i ≥ 1 1 ( i − 1 ) ! x i = ∑ i ≥ 0 x i + 1 i ! = x ∑ i ≥ 0 x i i ! = x e x
由此我们可以得到 F ( x ) F ( x ) 的封闭形式 F ( x ) = x F ( x ) = x 。
注意到 F ( x ) F ( x ) 的第 m m 次项为 0 0 ,而第 m m 项的系数为 { n m } { n m } ,由此可知原式成立。
n k = ∑ k i = 0 S ( k , i ) i ! ( n i ) n k = ∑ i = 0 k S ( k , i ) i ! ( n i )
第三类斯特林数#
第三类斯特林数也称作拉赫数,因为和第一二类斯特林数比较类似,所以有这两个名字。
拉赫数可以通过上升幂与下降幂之间的转化来定义,即:
x ¯ ¯ ¯ n = n ∑ k = 0 L ( n , k ) x k – – x n – – = n ∑ k = 0 ( − 1 ) n − k L ( n , k ) x ¯ ¯ ¯ k x n ¯ = ∑ k = 0 n L ( n , k ) x k _ x n _ = ∑ k = 0 n ( − 1 ) n − k L ( n , k ) x k ¯
由此我们可以得到 L ( n , k ) L ( n , k ) 的通项公式:
L ( n , k ) = ( n − 1 k − 1 ) n ! k ! L ( n , k ) = ( n − 1 k − 1 ) n ! k !
有这个通项公式可以知道第三类斯特林数的递推公式:
L ( n , k ) = ( n + k − 1 ) L ( n − 1 , k ) + L ( n − 1 , k − 1 ) L ( n , k ) = ( n + k − 1 ) L ( n − 1 , k ) + L ( n − 1 , k − 1 )
这个定西可以简单的通过代入来证明。
各种幂之间的转换#
这里先给出上升幂与下降幂的公式:
x ¯ ¯ ¯ n = x ( x + 1 ) . . . ( x + n − 1 ) x n – – = x ( x − 1 ) . . . ( x − n + 1 ) x n ¯ = x ( x + 1 ) . . . ( x + n − 1 ) x n _ = x ( x − 1 ) . . . ( x − n + 1 )
上升幂与下降幂之间的转换关系:
( − x ) n – – = ( − 1 ) n x ¯ ¯ ¯ n ( − x ) ¯ ¯ ¯ n = ( − 1 ) n x n – – ( − x ) n _ = ( − 1 ) n x n ¯ ( − x ) n ¯ = ( − 1 ) n x n _
二项式系数与下降幂之间的关系:
( n k ) = n k – – k ! ( n k ) = n k _ k !
证明比较显然,这里不再赘述。
x ¯ ¯ ¯ n = n ∑ i = 0 s ( n , i ) x i x n = n ∑ i = 0 ( − 1 ) n − i S ( n , i ) x ¯ i x n ¯ = ∑ i = 0 n s ( n , i ) x i x n = ∑ i = 0 n ( − 1 ) n − i S ( n , i ) x i ¯
证明:
x n – – = n ∑ i = 0 ( − 1 ) n − i s ( n , i ) x i x n = n ∑ i = 0 S ( n , i ) x i – x n _ = ∑ i = 0 n ( − 1 ) n − i s ( n , i ) x i x n = ∑ i = 0 n S ( n , i ) x i _
x ¯ ¯ ¯ n = n ∑ k = 0 L ( n , k ) x k – – x n – – = n ∑ k = 0 ( − 1 ) n − k L ( n , k ) x ¯ ¯ ¯ k x n ¯ = ∑ k = 0 n L ( n , k ) x k _ x n _ = ∑ k = 0 n ( − 1 ) n − k L ( n , k ) x k ¯
以上性质可以通过归纳以及上升幂与下降幂之间的转换来证明,这里不再赘述。
记忆上面的实际只需要注意什么时候添加 − 1 − 1 ,给定序列 x n – – , x n , x ¯ ¯ ¯ n x n _ , x n , x n ¯ ,从左往右转换时需要加,从右往左转换时不需要加,然后注意从上升下降幂转换到通常幂用第一类斯特林数,从通常幂转换到上升下降幂用第二类斯特林数。
通过以上式子,我们通过把上升幂用第三类斯特林数直接转化成下降幂,和先用第一类斯特林数转化成通常幂,再用第二类斯特林数转化成下降幂两种方式,通过比较下降幂系数,我们可以得到第三类斯特林数和两个斯特林数之间的关系:
L ( n , k ) = n ∑ k = 0 s ( n , k ) S ( k , i ) L ( n , k ) = ∑ k = 0 n s ( n , k ) S ( k , i )
生成函数#
第一类斯特林数的生成函数就是上升幂。
设 B k ( x ) = ∑ i ≥ k S ( i , k ) x i B k ( x ) = ∑ i ≥ k S ( i , k ) x i ,通过观察,我们可以知道:
B k ( x ) = x B k − 1 ( x ) + k x B k ( x ) B k ( x ) = x B k − 1 ( x ) + k x B k ( x )
由此我们可以得到:
B k ( x ) = x B k − 1 ( x ) 1 − k x = B k ( x ) = x 2 B k − 2 ( x ) ( 1 − k x ) ( 1 − ( k − 1 ) x ) = x k ∏ k r = 1 ( 1 − r x ) B k ( x ) = x B k − 1 ( x ) 1 − k x = B k ( x ) = x 2 B k − 2 ( x ) ( 1 − k x ) ( 1 − ( k − 1 ) x ) = x k ∏ r = 1 k ( 1 − r x )
设 F k ( x ) = ∑ i ≥ k S ( i , k ) x i i ! F k ( x ) = ∑ i ≥ k S ( i , k ) x i i ! 则我们可以得到:
F k ( x ) = ∑ i ≥ 0 1 k ! k ∑ j = 0 ( − 1 ) k − j ( k j ) j i x i i ! = 1 k ! k ∑ j = 0 ( − 1 ) k − j ( k j ) ∑ i ≥ 0 j i x i i ! = 1 k ! k ∑ j = 0 ( − 1 ) k − j ( k j ) e j x = ( e x − 1 ) k k ! F k ( x ) = ∑ i ≥ 0 1 k ! ∑ j = 0 k ( − 1 ) k − j ( k j ) j i x i i ! = 1 k ! ∑ j = 0 k ( − 1 ) k − j ( k j ) ∑ i ≥ 0 j i x i i ! = 1 k ! ∑ j = 0 k ( − 1 ) k − j ( k j ) e j x = ( e x − 1 ) k k !
斯特林反演#
斯特林反演公式:
f ( n ) = n ∑ i = 0 S ( n , i ) g ( i ) ⇔ g ( n ) = n ∑ i = 0 ( − 1 ) n − i s ( n , i ) f ( i ) f ( n ) = ∑ i = 0 n S ( n , i ) g ( i ) ⇔ g ( n ) = ∑ i = 0 n ( − 1 ) n − i s ( n , i ) f ( i )
要证明上面这个式子,我们首先引入一个反转公式:
x n = n ∑ i = 0 S ( n , i ) x i – = n ∑ i = 0 S ( n , i ) ( − 1 ) i ( − x ) ¯ i = n ∑ i = 0 S ( n , i ) ( − 1 ) i i ∑ j = 0 s ( i , j ) ( − x ) j = n ∑ j = 0 x j n ∑ i = j S ( n , i ) s ( i , j ) ( − 1 ) i − j x n = ∑ i = 0 n S ( n , i ) x i _ = ∑ i = 0 n S ( n , i ) ( − 1 ) i ( − x ) i ¯ = ∑ i = 0 n S ( n , i ) ( − 1 ) i ∑ j = 0 i s ( i , j ) ( − x ) j = ∑ j = 0 n x j ∑ i = j n S ( n , i ) s ( i , j ) ( − 1 ) i − j
比较两边系数你就可以得到:
n ∑ i = m S ( n , i ) s ( i , m ) ( − 1 ) i − m = [ n = m ] ∑ i = m n S ( n , i ) s ( i , m ) ( − 1 ) i − m = [ n = m ]
注意这里 − 1 − 1 的系数也可以是 n − i n − i ,容易发现当 n − m = 0 n − m = 0 时这两个数奇偶性相同,当奇偶性不同的时候这两个数绝对不相等,也就是说是 0 0 ,这并不影响我们这个式子的恒等。
用同样的方法,我们可以得到另一个反转公式:
n ∑ i = m s ( n , i ) S ( i , m ) ( − 1 ) i − m = [ n = m ] ∑ i = m n s ( n , i ) S ( i , m ) ( − 1 ) i − m = [ n = m ]
现在我们来证明斯特林反演。
g ( n ) = n ∑ i = 0 [ i = n ] g ( i ) = n ∑ i = 0 g ( i ) n ∑ j = i s ( n , j ) S ( j , i ) ( − 1 ) n − j = n ∑ j = 0 s ( n , j ) ( − 1 ) n − j j ∑ i = 0 S ( j , i ) g ( i ) = n ∑ j = 0 s ( n , j ) ( − 1 ) n − j f ( j ) g ( n ) = ∑ i = 0 n [ i = n ] g ( i ) = ∑ i = 0 n g ( i ) ∑ j = i n s ( n , j ) S ( j , i ) ( − 1 ) n − j = ∑ j = 0 n s ( n , j ) ( − 1 ) n − j ∑ i = 0 j S ( j , i ) g ( i ) = ∑ j = 0 n s ( n , j ) ( − 1 ) n − j f ( j )
同理,从右往左也可以证明,于是原式得证。
和二项式反演一样,这个式子也有许多变式。由反转公式对称性可以知道,我们交换等号两边的斯特林数仍然成立。我们让和式从 n n 开始枚举,枚举的量变成第一个数,式子仍然成立。只需要注意证明的时候不用 n − j n − j 而是用 j − m j − m 。这里不再赘述其他的几种斯特林反演。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】