斯特林数学习笔记

本文深入探讨了第一类和第二类斯特林数,包括它们的定义、计算方法(递推公式与通项公式)、如何求解整行和整列的值,以及相关性质和应用。通过实例解析斯特林数在组合数学和算法中的重要作用,并介绍了如何在编程竞赛题目中运用斯特林数解决实际问题。
摘要由CSDN通过智能技术生成

第二类斯特林数

定义

无符号第二类斯特林数 { n m } \begin{Bmatrix} n \\ m \end{Bmatrix} {nm} (也可记做 S ( n , m ) S(n,m) S(n,m))表示,将 n n n不同的球放入 m m m相同的盒子,且每个盒子非空的方案数。

例如, { 3 2 } = 3 \begin{Bmatrix} 3 \\ 2 \end{Bmatrix}=3 {32}=3。这里的三种分配方案分别为:
①在第一个盒子中放编号为 1 , 2 1,2 1,2 的球,在第二个盒子中放编号为 3 3 3 的球;
②在第一个盒子中放编号为 1 , 3 1,3 1,3 的球,在第二个盒子中放编号为 2 2 2 的球;
③在第一个盒子中放编号为 2 , 3 2,3 2,3 的球,在第二个盒子中放编号为 1 1 1 的球。

有符号第二类斯特林数表示,将 n n n不同的球放入 m m m不同的盒子,且每个盒子非空的方案数。

求法

递推公式

{ n m } = { n − 1 m − 1 } + m { n − 1 m } \begin{Bmatrix} n \\ m \end{Bmatrix}=\begin{Bmatrix} n-1 \\ m-1 \end{Bmatrix}+m\begin{Bmatrix} n-1 \\ m \end{Bmatrix} {nm}={n1m1}+m{n1m}

这里对上述公式做出简要阐释。

考虑第 n n n 个球的放法。
①将它放入一个新的盒子里面,这对应着 { n − 1 m − 1 } \begin{Bmatrix} n-1 \\ m-1 \end{Bmatrix} {n1m1}
②将它放入一个已经存在的盒子里面。由于当前共有 m m m 个盒子,所以共有 m m m 个位置可以放置,即 m × { n − 1 m } m \times \begin{Bmatrix} n-1 \\ m \end{Bmatrix} m×{n1m}

通项公式

{ n m } = 1 m ! ∑ i = 0 m ( − 1 ) i ( m i ) ( m − i ) n \begin{Bmatrix} n \\ m \end{Bmatrix}=\frac {1} {m!}\sum_{i=0}^m (-1)^i {m \choose i} (m-i)^n {nm}=m!1i=0m(1)i(im)(mi)n

这里对上述公式做出简要阐释。

上式中 i i i 表示空盒子的数量 ( − 1 ) i (-1)^i (1)i 表示一种容斥 ( m i ) m \choose i (im) 表示在 m m m 个盒子中钦定 i i i 个空盒子。不难发现,现在有 m − i m-i mi 个可以放球的盒子,所以每个球都有 m − i m-i mi 个位置可以放,根据乘法原理不难得到 ( m − i ) n (m-i)^n (mi)n 。注意,由于每个盒子相同,所以最后还要除以 m ! m! m!

从而,我们得到了上面的通项公式。

如果对这个公式依然没有基于实际意义上的理解,请继续往下看。

求一整行的值

我们拆开通项公式中的组合数,得到

{ n m } = m ! ∑ i = 0 m ( − 1 ) i 1 i ! 1 ( m − i ) ! ( m − i ) n \begin{Bmatrix} n \\ m \end{Bmatrix}=m!\sum_{i=0}^m (-1)^i \frac {1} {i!} \frac {1}{(m-i)!} (m-i)^n {nm}=m!i=0m(1)ii!1(mi)!1(mi)n

f i = ( − 1 ) i i ! f_i=\frac {(-1)^i} {i!} fi=i!(1)i g i = i n i ! g_i=\frac {i^n} {i!} gi=i!in ,那么原式可以写为

{ n m } = m ! ∑ i = 0 m f i   g m − i \begin{Bmatrix} n \\ m \end{Bmatrix}=m!\sum_{i=0}^m f_i \ g_{m-i} {nm}=m!i=0mfi gmi

不难发现,这是一个卷积的形式。

于是,我们直接做一遍 NTT 即可。

求一整列的值

此时,盒子的数量不变,但是球的数量会变。

考虑给每个盒子一个指数生成函数
F ( x ) = ∑ i = 1 ∞ x i i ! F(x)=\sum_{i=1}^{∞} \frac {x^i} {i!} F(x)=i=1i!xi

显然有 F ( x ) = e x − 1 F(x)=e^x-1 F(x)=ex1

不难发现:

k ! ∑ i = 0 ∞ { i k } x i i ! = F ( x ) k k! \sum_{i=0}^{∞} \dfrac {\begin{Bmatrix} i \\ k\end{Bmatrix}x^i} {i!}=F(x)^k k!i=0i!{ik}xi=F(x)k

于是,我们求出 e x − 1 e^x-1 ex1 ,然后大力多项式快速幂求出 F ( x ) k F(x)^k F(x)k ,最后再回带即可得到这一整列的斯特林数。

直接套用多项式快速幂的板子即可。注意常数项为 0 0 0 ,要先降次(除以 x x x ,系数整体左移一位),再快速幂,最后再升次(乘 x k x^k xk ,系数整体右移一位)。

性质

这个性质非常重要,请你朗读背诵,明天默写 把它记住。

n m = ∑ i = 0 m { m i } ( n i ) i ! n^m=\sum_{i=0}^m \begin{Bmatrix} m \\ i \end{Bmatrix} {n \choose i}i! nm=i=0m{mi}(in)i!

下面对这个式子做出简要阐述。

左式中的 n m n^m nm 表示,将 m m m 个不同的球放入 n n n 个不同的盒子的方案数,盒子可以为空。右式中的 i i i 表示非空盒子的数量 ( n i ) n \choose i (in) 表示在 n n n 个盒子中选择这样的 i i i 个盒子; { m i } i ! \begin{Bmatrix} m \\ i \end{Bmatrix}i! {mi}i! 表示将 m m m 个不同的球放入 i i i 个不同的盒子中的方案数,要求盒子不能为空。

另外,将这个式子给大力二项式反演就得到了第二类斯特林数的通项公式

应用

CF1278 Cards
Crash的文明世界
幼儿园篮球题
组合数问题
CF961G Partitions
*CF1278 Cards加强版

其中:
CF1278 Cards 的题解在
CF1278 Cards加强版的题解在
Crash 的文明世界的题解在

第一类斯特林数

定义

第一类斯特林数 [ n m ] \begin{bmatrix} n \\ m \end{bmatrix} [nm] (也可记做 s ( n , m ) s(n,m) s(n,m))表示,将 n n n不同的数划分为 m m m 个不同圆排列的方案数。

例如, [ 4 2 ] = 11 \begin{bmatrix} 4 \\ 2 \end{bmatrix}=11 [42]=11 。这里的 11 11 11 种划分方案分别为:
①第一个排列中包含 1 1 1 ,第二个排列中包含 2 , 3 , 4 2,3,4 2,3,4 。第一个的内部排列有 1 1 1 种,第二个的内部排列有 2 2 2 种( 2 , 3 , 4 2,3,4 2,3,4 3 , 2 , 4 3,2,4 3,2,4 ,注意循环同构的只算一种);

②第一个排列中包含 2 2 2 ,第二个排列中包含 1 , 3 , 4 1,3,4 1,3,4,内部排列分别有 1 , 2 1,2 1,2 种;
⋯ ⋯ \cdots \cdots

⑤第一个排列中包含 1 , 2 1,2 1,2 ,第二个排列中包含 3 , 4 3,4 3,4 ,内部排列分别有 1 , 1 1,1 1,1 种(注意 1 , 2 1,2 1,2 2 , 1 2,1 2,1 循环同构,只算一种);
⋯ ⋯ \cdots \cdots

求法

递推公式

[ n m ] = ( n − 1 ) [ n − 1 m ] + [ n − 1 m − 1 ] \begin {bmatrix} n \\ m \end {bmatrix} = (n-1)\begin{bmatrix} n-1 \\ m \end{bmatrix}+\begin{bmatrix} n-1 \\ m-1 \end{bmatrix} [nm]=(n1)[n1m]+[n1m1]

这里对这个式子做出简要阐述。

[ n − 1 m − 1 ] \begin{bmatrix} n-1 \\ m-1 \end{bmatrix} [n1m1] 表示,将新增的第 n n n 个数放入一个盒子里面, [ n − 1 m ] \begin{bmatrix} n-1 \\ m \end{bmatrix} [n1m] 则相反。前面的那个系数 n − 1 n-1 n1 表示,将第 n n n 个数放到 n − 1 n-1 n1 个已有的数中的任何一个左边。

求一整行的斯特林数

第一类斯特林数有一个性质:

x n ‾ = ∑ i = 0 n [ n i ] x i x^{\overline n}=\sum_{i=0}^n \begin{bmatrix} n \\ i \end{bmatrix} x^i xn=i=0n[ni]xi

若我们把它看做一个关于 x x x 的多项式,那么 x x x n n n 次下降幂的各项系数即为这一行的斯特林数。

直接分治 NTT 的话,时间复杂度为 O ( n log ⁡ 2 n ) O(n \log^2 n) O(nlog2n) 。我们需要优化。



G ( x ) = x n ‾ = ∏ i = 0 n − 1 ( x + i ) = ∑ i = 0 n − 1 g i   x i G(x)=x^{\overline n}=\prod_{i=0}^{n-1} (x+i)=\sum_{i=0}^{n-1} g_i\ x^i G(x)=xn=i=0n1(x+i)=i=0n1gi xi

A ( x ) = x 2 n ‾ = ∏ i = 0 2 n − 1 ( x + i ) = ∑ i = 0 2 n − 1 a i   x i A(x)=x^{\overline{2n}}=\prod_{i=0}^{2n-1} (x+i)=\sum_{i=0}^{2n-1} a_i\ x^i A(x)=x2n=i=02n1(x+i)=i=02n1ai xi

F ( x ) = ∏ i = n 2 n − 1 ( x + i ) = ∏ i = 0 n − 1 ( ( x + n ) + i ) = ∑ i = 0 n − 1 f i   x i F(x)=\prod_{i=n}^{2n-1} (x+i)=\prod_{i=0}^{n-1} ((x+n)+i)=\sum_{i=0}^{n-1} f_i \ x^{i} F(x)=i=n2n1(x+i)=i=0n1((x+n)+i)=i=0n1fi xi

显然有 G ( x ) F ( x ) = A ( x ) G(x)F(x)=A(x) G(x)F(x)=A(x) 。所以,现在关键在于求出 F ( x ) F(x) F(x)

我们把 x + n x+n x+n 看成一个整体,那么式子就与 G G G 长得一样了。从而

F ( x ) = ∑ i = 0 n − 1 f i   ( x + n ) i F(x)=\sum_{i=0}^{n-1} f_i \ (x+n)^i F(x)=i=0n1fi (x+n)i

F ( x ) = ∑ i = 0 n − 1 f i   ∑ j = 0 i ( i j ) x j n i − j F(x)=\sum_{i=0}^{n-1} f_i \ \sum_{j=0}^i {i \choose j} x^j n^{i-j} F(x)=i=0n1fi j=0i(ji)xjnij

F ( x ) = ∑ j = 0 n − 1 x j ∑ i = j n − 1 ( i j ) n i − j f i F(x)=\sum_{j=0}^{n-1} x^j \sum_{i=j}^{n-1} {i \choose j} n^{i-j} f_i F(x)=j=0n1xji=jn1(ji)nijfi

F ( x ) = ∑ j = 0 n − 1 x j j !   ∑ i = j n − 1 ( i !   f i ) × ( n i − j ( i − j ) ! ) F(x)=\sum_{j=0}^{n-1} \frac {x^j} {j!} \ \sum_{i=j}^{n-1} (i! \ f_i) \times(\frac {n^{i-j}} {(i-j)!}) F(x)=j=0n1j!xj i=jn1(i! fi)×((ij)!nij)

p i = i !   f i p_i=i!\ f_i pi=i! fi q i = n i i ! q_i=\dfrac {n^i} {i!} qi=i!ni ,那么

F ( x ) = ∑ j = 0 n − 1 x j j ! ∑ i = j n − 1 p i q i − j F(x)=\sum_{j=0}^{n-1} \frac {x^j} {j!} \sum_{i=j}^{n-1} p_i q_{i-j} F(x)=j=0n1j!xji=jn1piqij

现在关键在于计算出后面的那个 ∑ i = j n − 1 p i q i − j \sum_{i=j}^{n-1} p_i q_{i-j} i=jn1piqij

我们套路地将 p p p 翻转一下:

F j = 1 j ! ∑ i = j n − 1 p n − i + 1 q i − j F_j=\frac 1 {j!}\sum_{i=j}^{n-1} p_{n-i+1} q_{i-j} Fj=j!1i=jn1pni+1qij

于是我们直接将 p , q p,q p,q 给卷起来再翻转回去,最后第 j j j 项除以 j ! j! j! 就得到了 F ( x ) F(x) F(x) 的各项系数。

直接倍增即可。

令时间复杂度为 T ( n ) T(n) T(n) ,那么显然有
T ( n ) = n log ⁡ n + T ( n 2 ) T(n)=n \log n+T(\frac n 2) T(n)=nlogn+T(2n)

于是 T ( n ) = O ( n log ⁡ n ) T(n)=O(n \log n) T(n)=O(nlogn)

求一整列的斯特林数

第二类斯特林数中所说的方法类似。

由于一个长度为 n n n 的圆排列有 n ! n \frac {n!} {n} nn! 种,所以对于一个圆排列,它的 EGF 应为
F ( x ) = ∑ i = 1 ∞ i ! i x i i ! = ∑ i = 1 ∞ x i i F(x)=\sum_{i=1}^{∞} \frac {i!} {i} \frac {x^i} {i!}=\sum_{i=1}^{∞} \frac {x^i} {i} F(x)=i=1ii!i!xi=i=1ixi

答案即为 F ( x ) k F(x)^k F(x)k 的各项系数。

直接套用多项式快速幂的板子即可。注意常数项为 0 0 0 ,要先降次(除以 x x x ,系数整体左移一位),再快速幂,最后再升次(乘 x k x^k xk ,系数整体右移一位)。

性质

n m ‾ = ∑ i = 0 m [ m i ] n i n^{\overline m}=\sum_{i=0}^m \begin{bmatrix} m \\ i \end{bmatrix} n^i nm=i=0m[mi]ni

n m ‾ = ∑ i = 0 m [ m i ] ( − 1 ) m − i n i n^{\underline m}=\sum_{i=0}^m\begin{bmatrix} m \\ i \end{bmatrix} (-1)^{m-i} n^i nm=i=0m[mi](1)mini

例题

CF960G Bandit Blues
它的题解在

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值