學習總結:斯特林數( Stirling number )


基本定義

第一類斯特林數:$1 \dots n$的排列中恰好有$k$個環的個數;或是,$n$元置換可分解為$k$個獨立的輪換的個數。記作

$$ \begin{bmatrix} n \\ k \end{bmatrix}. $$

第二類斯特林數:將$n$個元素分成$k$個非空集合的方案數。記作

$$ \begin{Bmatrix} n \\ k \end{Bmatrix}. $$

 

根據定義,我們有

$$ \sum_{k=0}^n \begin{bmatrix} n \\ k \end{bmatrix} = n!, $$

$$ \sum_{k=0}^n \begin{Bmatrix} n \\ k \end{Bmatrix} = B_n, $$

其中$B_n$是 Bell 數

遞推關系

第一類斯特林數:考慮$\begin{bmatrix} n \\ k \end{bmatrix}$。枚舉第$n$個元素,其若自成一個環,則有$\begin{bmatrix} n-1 \\ k-1 \end{bmatrix}$種方案;若其放在已有的某個環中,則有$n-1$個位置可放,於是有$(n-1)\begin{bmatrix} n-1 \\ k \end{bmatrix}$種方案。因此,

$$ \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 \\ k \end{Bmatrix}$。枚舉第$n$個元素,若其自成一份,則有$\begin{Bmatrix} n-1 \\ k-1 \end{Bmatrix}$種方案;若其放在已有的某份,則有$k$份可選擇,於是有$k\begin{Bmatrix} n-1 \\ k \end{Bmatrix}$種方案。因此,

$$ \begin{Bmatrix} n \\ k \end{Bmatrix} = k\begin{Bmatrix} n-1 \\ k \end{Bmatrix} + \begin{Bmatrix} n-1 \\ k-1 \end{Bmatrix}. $$

以上遞推式,可在$O(nk)$的復雜度內求出斯特林數。

斯特林數與階乘冪

我們定義下降冪(Falling Factorial):

$$ x^{\underline{n}} = x(x-1)\cdots (x-n+1). $$

以及上升冪(Rising Factorial):

$$ x^{\overline{n}} = x(x+1)\cdots (x+n-1). $$

則有以下等式:

$$
\begin{aligned}
x^{\underline{n}} = \sum_{k=0}^n (-1)^{n-k} \begin{bmatrix} n \\ k \end{bmatrix} x^k  & \Longleftrightarrow x^n = \sum_{k=0}^n \begin{Bmatrix} n \\ k \end{Bmatrix} x^{\underline{k}} \\
x^{\overline{n}} = \sum_{k=0}^n \begin{bmatrix} n \\ k \end{bmatrix} x^k  & \Longleftrightarrow x^n = \sum_{k=0}^n (-1)^{n-k} \begin{Bmatrix} n \\ k \end{Bmatrix} x^{\overline{k}} \\
x^{\overline{n}} = \sum_{k=0}^n L(n, k) x^{\underline{k}}  & \Longleftrightarrow x^{\underline{n}} = \sum_{k=0}^n (-1)^{n-k} L(n, k) x^{\overline{k}} 
\end{aligned}
$$

其中

$$ L(n, k) = \sum_j \begin{bmatrix} n \\ j \end{bmatrix} \begin{Bmatrix} j \\ k \end{Bmatrix} = \binom{n-1}{k-1} \frac {n!} {k!}. $$

注:最常用的是將$x^n$分成若干個$x^{\underline{k}}$之和,或者是$\binom{x}{k}$之和,即

$$ x^n = \sum_{k=0}^n \begin{Bmatrix} n \\ k \end{Bmatrix} x^{\underline{k}} = \sum_{k=0}^n k! \begin{Bmatrix} n \\ k \end{Bmatrix} \binom{x}{k}. $$

斯特林反演

斯特林數和階乘冪的關系可推廣至一般函數:

$$
\begin{aligned}
g(n) = \sum_{k=0}^n (-1)^{n-k} \begin{bmatrix} n \\ k \end{bmatrix} f(k)  & \Longleftrightarrow f(n) = \sum_{k=0}^n \begin{Bmatrix} n \\ k \end{Bmatrix} g(k) \\
g(n) = \sum_{k=0}^n L(n, k) f(k) & \Longleftrightarrow f(n) = \sum_{k=0}^n (-1)^{n-k} L(n, k) g(k) 
\end{aligned}
$$

斯特林數的快速求解

第一類斯特林數

為快速計算$\begin{bmatrix} n \\ k \end{bmatrix}$,我們利用

$$ x^{\overline{n}} = \sum_{k=0}^n \begin{bmatrix} n \\ k \end{bmatrix} x^k. $$

令$f(x) = x^{\overline{n}}, g(x) = (x+n)^{\overline{n}}$,則$f(x)g(x) = x^{\overline{2n}}$。注意到$f(x)$中$x^k$的系數對應了$\begin{bmatrix} n \\ k \end{bmatrix}$。若求得了$g(x)$,計算$f(x)$與$g(x)$的多項式乘積即可得到$\begin{bmatrix} 2n \\ \cdot \end{bmatrix}$。而求$g(x)$的方法如下:

$$ f(x) = \sum_{k=0}^n a_k x^k, $$

$$
\begin{aligned}
g(x)
& = \sum_{k=0}^n a_k (x+n)^k \\
& = \sum_{k=0}^n a_k \sum_{i=0}^k \binom{k}{i} n^{k-i} x^i \\
& = \sum_{k=0}^n \frac{1} {(n-k)!} x^{n-k} \sum_{i+j=k} \frac{n^i}{i!} a_{n-j} (n-j)!
\end{aligned}
$$

就變成了卷積計算。用快速傅里葉變換則計算$g(x)$的時間復雜度為$O(n \log n)$。

總的時間復雜度為

$$ T(n) = T(n/2)+O(n\log n), $$

解為$T(n) = O(n \log n)$。

第二類斯特林數

我們仍可用第一類斯特林數的做法並利用

$$ x^n = \sum_{k=0}^n \begin{Bmatrix} n \\ k \end{Bmatrix} x^{\underline{k}}. $$

但我們有一個更好的選擇:

$$ \begin{Bmatrix} n \\ k \end{Bmatrix} = \frac 1 {k!} \sum_{i=0}^k (-1)^{k-i} \binom{k}{i} i^n = \sum_{i+j=k} \frac{i^n}{i!} \frac{(-1)^j}{j!}. $$

就變成了卷積計算,用快速傅里葉變換則時間復雜度為$O(n \log n)$。

 

一些例題

CodeForces 932E. Team Work

HDU 4625. JZPTREE

CodeForces 1097G. Vladislav and a Great Legend

CodeForces 960G. Bandit Blues


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM