斯特林数 学习笔记

本文详细介绍了斯特林数的两类,包括第二类斯特林数(斯特林子集数)和第一类斯特林数(斯特林轮换数),阐述了它们的递推关系、通项公式以及计算方法。讨论了斯特林数在染色问题、轮换划分等组合问题中的应用,并给出了从阶乘幂和方幂互相转化的公式。此外,还提到了斯特林反演的概念。
摘要由CSDN通过智能技术生成

斯特林数 学习笔记

第二类斯特林数(斯特林子集数)

{ n k } \begin{Bmatrix}n \\ k\end{Bmatrix} {nk},表示将 n n n 个两两不同的元素,划分为 k k k 个互不区分的非空集合的方案数。

有递推式 { n k } = k ⋅ { n − 1 k } + { n − 1 k − 1 } , { n 0 } = [ n = 0 ] \begin{Bmatrix}n \\ k\end{Bmatrix}=k\cdot \begin{Bmatrix}n-1 \\ k\end{Bmatrix}+\begin{Bmatrix}n-1 \\ k-1\end{Bmatrix},\begin{Bmatrix}n \\ 0\end{Bmatrix}=[n=0] {nk}=k{n1k}+{n1k1},{n0}=[n=0]

同时还有通项公式

{ n k } = ∑ i = 0 k ( − 1 ) k − i i n ( k − i ) ! i ! \begin{Bmatrix}n \\ k\end{Bmatrix}=\sum_{i=0}^k\dfrac{(-1)^{k-i}i^n}{(k-i)!i!} {nk}=i=0k(ki)!i!(1)kiin

证明:

考虑这样一个问题:将 n n n 个物品涂成 k k k 种颜色,我们用两种方法计算它的方案数:

k n = ∑ i = 0 k ( k i ) { n i } i ! k^n=\sum_{i=0}^k\binom{k}{i}\begin{Bmatrix}n \\ i\end{Bmatrix}i! kn=i=0k(ik){ni}i!

左边是显然的。右边是枚举用几种颜色涂。(注意到第二类斯特林数不允许空集)

做一个二项式反演,得到

{ n k } k ! = ∑ i = 0 k ( − 1 ) k − i ( k i ) i n \begin{Bmatrix}n \\ k\end{Bmatrix}k!=\sum_{i=0}^k(-1)^{k-i}\binom{k}{i}i^n {nk}k!=i=0k(1)ki(ik)in

稍加整理就能得到结论。

第一类斯特林数(斯特林轮换数)

[ n k ] \begin{bmatrix}n \\ k\end{bmatrix} [nk],将 n n n 个两两不同的元素,划分为 k k k 个互不区分的非空轮换的方案数。

有递推式 [ n k ] = ( n − 1 ) [ n − 1 k ] + [ n − 1 k − 1 ] , [ n 0 ] = [ n = 0 ] \begin{bmatrix}n \\ k\end{bmatrix}=(n-1)\begin{bmatrix}n-1 \\ k\end{bmatrix}+\begin{bmatrix}n-1 \\ k-1\end{bmatrix},\begin{bmatrix}n \\ 0\end{bmatrix}=[n=0] [nk]=(n1)[n1k]+[n1k1],[n0]=[n=0]

它没有实用的通项公式。

斯特林数的计算

显然,两种斯特林数都可以 O ( n k ) O(nk) O(nk) 求。

第二类斯特林数 · 行

根据通项公式

{ n k } = ∑ i = 0 n ( − 1 ) k − i i n ( k − i ) ! i ! \begin{Bmatrix}n \\ k\end{Bmatrix}=\sum_{i=0}^n\dfrac{(-1)^{k-i}i^n}{(k-i)!i!} {nk}=i=0n(ki)!i!(1)kiin

于是设 f n = ∑ k ≥ 0 { n k } x k , g n = ∑ k ≥ 0 i n i ! x k f_n=\sum_{k\ge 0}\begin{Bmatrix}n \\ k\end{Bmatrix}x^k,g_n=\sum_{k\ge 0}\dfrac{i^n}{i!}x^k fn=k0{nk}xk,gn=k0i!inxk,则 f n = e − x ∗ g n f_n=e^{-x}*g_n fn=exgn

第二类斯特林数 · 列

先考虑把相同的集合变成不同的非空盒子,则最后答案需要除以 k ! k! k!

设一个非空盒子的 EGF(以物品数量为组合对象)为 G ( x ) G(x) G(x) k k k 个非空盒子的 EGF 为 F ( x ) F(x) F(x)。故有

G ( x ) = ∑ i ≥ 1 x i i = e x − 1 , F ( x ) = G k ( x ) G(x)=\sum_{i\ge 1} \dfrac{x^i}{i}=e^x-1,F(x)=G^k(x) G(x)=i1ixi=ex1,F(x)=Gk(x)

于是有

∑ i ≥ 0 { i k } x i i ! = ( e x − 1 ) k k ! \sum_{i\ge 0}\begin{Bmatrix}i \\ k\end{Bmatrix}\dfrac{x^i}{i!}=\dfrac{(e^x-1)^k}{k!} i0{ik}i!xi=k!(ex1)k

直接多项式快速幂计算。

第一类斯特林数 · 行

f n ( x ) = ∑ i ≥ 0 [ n k ] x i f_n(x)=\sum_{i\ge 0}\begin{bmatrix}n \\ k\end{bmatrix}x^i fn(x)=i0[nk]xi,由递推式得到

f n + 1 ( x ) = ( x + n ) f n ( x ) f_{n+1}(x)=(x+n)f_n(x) fn+1(x)=(x+n)fn(x)

得到

f n ( x ) = ∏ i = 0 n − 1 ( x + i ) = x n ‾ f_n(x)=\prod_{i=0}^{n-1}(x+i)=x^{\overline n} fn(x)=i=0n1(x+i)=xn

我们的任务转化为计算上升幂。可以通过分治 FFT 以 O ( n log ⁡ 2 n ) O(n\log^2n) O(nlog2n) 完成。

但是,也可以如下计算:

考虑倍增, f 2 n ( x ) = x 2 n ‾ = x n ‾ ( x + n ) n ‾ = f n ( x ) f n ( x + n ) f_{2n}(x)=x^{\overline{2n}}=x^{\overline {n}}(x+n)^{\overline{n}}=f_n(x)f_n(x+n) f2n(x)=x2n=xn(x+n)n=fn(x)fn(x+n)

下面为了方便表述,设 f n ( x ) = ∑ i ≥ 0 a i x i f_n(x)=\sum_{i\ge 0}a_ix^i fn(x)=i0aixi

f n ( x + n ) = ∑ i = 0 n a i ( x + n ) i = ∑ i = 0 n a i ∑ j = 0 i ( i j ) x j n i − j = ∑ j = 0 n x j j ! ∑ i = j n n i − j ( i − j ) ! a i i ! \begin{aligned} f_n(x+n)=&\sum_{i=0}^na_i(x+n)^i \\=&\sum_{i=0}^na_i\sum_{j=0}^i\binom{i}{j}x^jn^{i-j} \\=&\sum_{j= 0}^n\dfrac{x^j}{j!}\sum_{i = j}^n\dfrac{n^{i-j}}{(i-j)!}a_ii! \end{aligned} fn(x+n)===i=0nai(x+n)ii=0naij=0i(ji)xjnijj=0nj!xji=jn(ij)!nijaii!

A i = a i i ! , B i = n i i ! A_i=a_ii!,B_i=\dfrac{n^i}{i!} Ai=aii!,Bi=i!ni

f n ( x + n ) = ∑ j = 0 n x j j ! ∑ i = j n A ( i ) B ( i − j ) = ∑ j = 0 n x j j ! ∑ i = 0 n − j A ( i + j ) B ( i ) \begin{aligned} f_n(x+n)=&\sum_{j=0}^n\dfrac{x^j}{j!}\sum_{i=j}^nA(i)B(i-j) \\=&\sum_{j=0}^n\dfrac{x^j}{j!} \sum_{i=0}^{n-j}A(i+j)B(i) \end{aligned} fn(x+n)==j=0nj!xji=jnA(i)B(ij)j=0nj!xji=0njA(i+j)B(i)

后面那部分显然可以卷积,于是再做个和、除以 j ! j! j! 就可以得到 f n ( x + n ) f_n(x+n) fn(x+n)

总复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)

第一类斯特林数 · 列

先写出单个轮换的EGF:

f ( x ) = ∑ i ≥ 1 ( i − 1 ) ! x i i ! = ∑ i ≥ 1 x i i = ln ⁡ 1 1 − x f(x)=\sum_{i\ge 1}(i-1)!\dfrac{x^i}{i!}=\sum_{i\ge 1}\dfrac{x^i}{i}=\ln\dfrac{1}{1-x} f(x)=i1(i1)!i!xi=i1ixi=ln1x1

于是, k k k 个轮换的 EGF 即为

f k ( x ) k ! \dfrac{f^k(x)}{k!} k!fk(x)

做多项式快速幂即可。

阶乘幂与方幂的转化

根据上面第一类斯特林数的性质,有

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 n ‾ = ∑ i = 0 n ( − 1 ) n − i [ n i ] x i x^{\underline{n}}=\sum_{i=0}^n(-1)^{n-i}\begin{bmatrix}n \\ i\end{bmatrix}x^i xn=i=0n(1)ni[ni]xi

类似地,有式子

x n = ∑ i = 0 n { n i } ( x i ) i ! x^n=\sum_{i=0}^n\begin{Bmatrix}n \\ i\end{Bmatrix}\binom{x}{i} i! xn=i=0n{ni}(ix)i!

我们再看看怎么转化回去:

( x i ) i ! = x i ‾ \binom{x}{i}i!=x^{\underline i} (ix)i!=xi

于是

x n = ∑ i = 0 n { n i } x i ‾ x^n=\sum_{i=0}^n\begin{Bmatrix}n \\ i\end{Bmatrix}x^{\underline i} xn=i=0n{ni}xi

同样有方幂转上升幂

x n = ∑ i = 0 n ( − 1 ) n − i { n i } x i ‾ x^n=\sum_{i=0}^n(-1)^{n-i}\begin{Bmatrix}n \\ i\end{Bmatrix}x^{\overline{i}} xn=i=0n(1)ni{ni}xi

这两个有符号斯特林数推出的式子,可以直接用上升幂和下降幂的相似性得到(它们展开后仅差一些负号)。

当然,这四个式子都可以数学归纳证明。

如何记忆呢?

将阶乘幂转化为方幂,使用第一类斯特林数(它的 OGF 决定了这一点);

将方幂转化为阶乘幂,使用第二类斯特林数(它的 组合意义 决定了这一点)。

那么,什么时候添加 ( − 1 ) n − i (-1)^{n-i} (1)ni?显然有 x n ‾ ≥ x n ≥ x n ‾ x^{\overline{n}}\ge x^n \ge x^{\underline{n}} xnxnxn,当将大的幂转化为小的幂的时候,需要添加负号。

斯特林反演

g ( n ) = ∑ i = 0 n { n i } f ( i ) g(n)=\sum_{i=0}^n\begin{Bmatrix}n \\ i\end{Bmatrix}f(i) g(n)=i=0n{ni}f(i)

f ( n ) = ∑ i = 0 n ( − 1 ) n − i { n i } g ( i ) f(n)=\sum_{i=0}^n(-1)^{n-i}\begin{Bmatrix}n \\ i\end{Bmatrix}g(i) f(n)=i=0n(1)ni{ni}g(i)

当然,把第一类和第二类反过来也对;根据反演的一般套路,改为枚举 j ≥ i j\ge i ji 也对。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日居月诸Rijuyuezhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值