本文為博主原創,轉載請標明出處。
斯特林數 學習筆記
原文鏈接https://www.cnblogs.com/zhouzhendong/p/Stirling-Number.html
$\newcommand{\strb}[2]{\left \{ \begin{matrix}{#1}\\{#2}\end{matrix} \right \}}\newcommand{\stra}[2]{\left [ \begin{matrix}{#1}\\{#2}\end{matrix} \right ] }\newcommand{\bino}[2]{\left ( \begin{matrix}{#1}\\{#2}\end{matrix} \right ) }\newcommand{\udl}{\underline}\newcommand{\ovl}{\overline}$
第一類斯特林數
定義
$S_1(n,m)$ 表示 $n$ 個元素,排成 $m$ 個輪換的方案數,記做 $\stra nm$ 。遞推公式為:
$$\stra{n}{k}=(n-1)\stra{n-1}{k}+\stra{n-1}{k-1}$$
可以通過其組合意義來理解:用 $n$ 個元素構成 $k$ 個輪換,其中,第 $n$ 個元素可以獨立構成一個新的輪換,有 $\stra {n-1}{k-1}$ 種方案;也可以插入到原有的輪換中,可以插入到之前的任意一個元素的左邊,故有 $(n-1)\stra {n-1}k$ 種方案。
從組合意義出發證明一個式子
證明
$$n! = \sum_{i=0}^{n} \stra{n}{i}$$
解: 考慮其組合意義。一個排列,唯一地對應了一個置換:
$$ \begin{pmatrix} 1&2&3&4&\cdots&n\\ p_1&p_2&p_3&p_4&\cdots &p_n \end{pmatrix} $$
而一個置換,唯一地對應了一組輪換。例如排列 $(1,5,3,2,4)$ ,就可以看做輪換組 $[1][2,5,4][3]$ 。如果兩個排列不同,那么他們對應的輪換中,必然有一個元素的下一個元素不同,故排列與輪換一一對應。而原式右側的式子正是有 $0$~$n$ 個輪換的方案數,就等價於左邊。
證明一個重要式子
證明
$$x^\udl{n}= \sum_{i=0}^{n} \stra ni(-1)^{n-i} x^i \tag{1}$$
解:利用數學歸納法以及推式子:
$$ \begin{eqnarray*} x^\udl {n+1} &=& (x-n) x^\udl n\\ &=& x\cdot x^\udl n - n x^\udl n\\ &=& \left ( \sum_{i=0}^n \stra ni (-1)^{n-i} x^{i+1} \right ) - \left (n\sum_{i=0}^n \stra ni (-1)^{n-i} x^i \right )\\ &=& \left ( \sum_{i=1}^{n+1} \stra n{i-1} (-1)^{n-i-1} x^i \right ) - \left (n\sum_{i=1}^{n+1} \stra ni (-1)^{n-i} x^i \right )\\ &=&\sum_{i=1}^{n+1}\left (\stra n{i-1} + n \stra ni \right )(-1)^{n+1-i}x^i\\ &=&\sum_{i=1}^{n+1}\stra {n+1}{i} (-1)^{n+1-i} x^i \end{eqnarray*} $$
至此,得證。
這個式子為何重要呢?是因為它告訴我們斯特林數和下降冪有關系!下降冪展開后,所有系數的絕對值就是一行斯特林數。
求第一類斯特林數
現在要求你求出所有 $S_1(n,i)_{|i\in [0,n]}$ 。
如果 $n$ 不大,顯然可以直接通過定義式來求。但是 $n$ 如果比較大呢?
在對於 $(1)$ 的證明中,我們知道了下降冪的每一項系數在數值上面等於斯特林數。所以我們只需要求出下降冪就可以了。
直接分治 FFT 顯然可以做到 $O(n\log^2 n)$ 的時間復雜度。現在我們來考慮另一種做——倍增法:
為了避免各種 $-1$ 系數的煩惱,我們用上升冪來求斯特林數。
假設 $f(x) = x^\ovl n ,g(x)=(x+n)^\ovl n$ ,則 $f(x)g(x)=x^\ovl{2n}$ 。我們需要做的僅僅是通過 $f(x)$ 來快速地求 $g(x)$ 。於是:
$$ 設 f(x)=\sum_{i=0}^n a_i x^i \\ \begin {eqnarray*} 則g(x)&=&\sum_{i=0}^n a_i (x+n)^i \\ &=& \sum_{i=0}^n a_i \sum_{j=0}^i \bino ij n^{i-j} x^j\\ &=& \sum_{i=0}^n \left (\sum_{j=i}^n \bino ji n^{j-i} a_j\right )x^i \end {eqnarray*} $$
這個東西顯然是一個卷積。直接算就好了。於是總的時間復雜度為
$$T(n) = T(n/2) + O(n\log n) = O(n\log n)$$
第二類斯特林數
定義
$s_2(n,m)$ 表示 $n$ 個元素分成 $m$ 個集合的方案數,記做 $\strb nm$ 。遞推公式為:
$$\strb nm = \strb {n-1}{m-1} + m\strb {n-1}{m}$$
從組合意義理解:考慮第 $n$ 個元素的擺放方式。第 $n$ 個元素可以獨立構成一個新的集合,方案數是 $\strb {n-1}{m-1}$ ;也可以加入到原有的集合中,方案數是 $m\strb {n-1}m$ 。
證明一個重要式子
證明
$$x^n = \sum_{k=0}^{n} \strb nk x^\udl{k}$$
解
$$\begin {eqnarray*} x^n &=& \sum_{k=0}^{n} \strb nk x^\udl{k}\\ x^n &=& x \cdot x^{n-1} \\ &=&x \sum_{i=0}^{n-1} \strb{n-1}{i} x^\udl i\\ &=&\sum_{i=0}^{n-1} \strb{n-1}{i} (x^\udl {i+1}+ix^\udl i) \\ &=&\sum_{i=0}^{n-1} \strb{n-1}{i} x^\udl {i+1}+\sum_{i=0}^{n-1} \strb{n-1}{i}ix^\udl i \\ &=&\sum_{i=0}^{n} \strb{n-1}{i-1} x^\udl {i}+\sum_{i=0}^{n-1} \strb{n-1}{i}ix^\udl i \\ &=&\sum_{i=0}^{n} \left ( \strb{n-1}{i-1}+i\strb {n-1}i \right ) x^\udl i\\ &=&\sum_{i=0}^{n} \strb ni x^\udl{i} \end {eqnarray*}$$
這個式子說明了第二類斯特林數也和下降冪、整數冪有關系。
如何求第二類斯特林數
首先證明這個式子:
$$ \begin{eqnarray*} m!\strb nm &=& \sum_{k=0}^m \bino mk k^n (-1)^{m-k}\\ 解:\strb nm &=& \strb {n-1}{m-1} + m\strb {n-1}m\\ &=& \sum_{k=0}^{m-1} \cfrac {\bino {m-1}{k}k^{n-1}(-1)^{m-1-k}}{(m-1)!} + m\sum_{k=0}^{m} \cfrac {\bino{m}{k}k^{n-1}(-1)^{m-k}}{m!}\\ &=& \sum_{k=0}^{m} \cfrac {\bino {m-1}{k}k^{n-1}(-1)^{m-1-k}}{(m-1)!} + \sum_{k=0}^{m} \cfrac {\bino{m}{k}k^{n-1}(-1)^{m-k}}{(m-1)!}\\ &=& \sum_{k=0}^{m} \cfrac {\bino{m}{k}k^{n-1}(-1)^{m-k}}{(m-1)!} - \sum_{k=0}^{m} \cfrac {\bino {m-1}{k}k^{n-1}(-1)^{m-k}}{(m-1)!} \\ &=& \sum_{k=0}^{m} \cfrac {\bino{m-1}{k-1}k^{n-1}(-1)^{m-k}}{(m-1)!}\\ &=& \sum_{k=0}^{m} \cfrac {(m-1)!k^{n-1}(-1)^{m-k}}{(k-1)!(m-k)!(m-1)!}\\ &=& \sum_{k=0}^{m} \cfrac {m!k^{n}(-1)^{m-k}}{k!(m-k)!m!}\\ &=& \sum_{k=0}^{m} \cfrac {\bino mk k^{n}(-1)^{m-k}}{m!}\\ &\Longrightarrow& m!\strb nm = \sum_{k=0}^m \bino mk k^n (-1)^{m-k}\\ \end{eqnarray*} $$
於是自然就可以發現其中的卷積形式。一行斯特林數就可以用 FFT 來快速得到了。
斯特林反演
UPD(2019-03-10): 這個東西貌似挺有用的。我更新一下。
就幾個式子:
先把后面的反轉公式抄上來:
反轉公式:
$$ \begin {eqnarray*} \sum_{k=1}^n \stra nk \strb km (-1)^{n-k} &=& [m=n]\\ \sum_{k=1}^n \strb nk \stra km (-1)^{n-k} &=& [m=n] \end {eqnarray*} $$
有什么用?
舉個例子:
假設
$$g(n) = \sum_{i=0}^n \strb n i f(i)$$
則
$$\begin{eqnarray*}f(n) &=& \sum_{i=0}^n [i = n] f(i)\\ &=& \sum_{i=0}^n\left (\sum_{k=0}^n\stra n k\strb ki(-1)^{n-k} \right)f(i)\\&=&\sum_{k=0}^n (-1)^{n-k}\stra nk \sum_{i=0}^n \strb k i f(i) \\&=& \sum_{i=0}^n (-1)^{n-i} \stra n i g(i)\end{eqnarray*}$$
類似地,總共可以得到 4 個這樣的反演公式:
$$\begin {eqnarray*}f(n) = \sum_{i=0}^n \strb ni g(i) &\Longrightarrow& g(n) = \sum_{i=0}^n (-1) ^{n-i }\stra ni f(i)\\f(n) = \sum_{i=0}^n (-1)^{n-i} \strb ni g(i) &\Longrightarrow & g(n) = \sum_{i=0}^n \stra ni f(i) \\ f(n) = \sum_{i=0}^n \stra ni g(i) &\Longrightarrow & g(n) = \sum_{i=0}^n (-1)^{n-i}\strb ni f(i)\\ f(n) = \sum_{i=0}^n (-1)^{n-i}\stra ni g(i) &\Longrightarrow & g(n) = \sum_{i=0}^n \strb ni f(i)\end{eqnarray*}$$
可以用於解特定的與斯特林數有關的方程組。
廣義斯特林數
只(我)要(只)記(知)住(道):
$$ \strb nk = \stra {-k}{-n} $$
斯特林數的總結與拓展
(以下公式來源:具體數學 6.1 節;證明由博主自己瞎證的,僅作參考)
基本式子:
$$ \begin{eqnarray*} \strb{n}{k}&=&k\strb{n-1}{k}+\strb{n-1}{k-1}\\ \stra{n}{k}&=&(n-1)\stra{n-1}{k}+\stra{n-1}{k-1}\\ n! &=& \sum_{i=0}^{n} \stra{n}{i}\\ \strb nk &=& \stra {-k}{-n} \end{eqnarray*} $$
特殊值:
$$ \begin{eqnarray*} \strb n0 &=& \stra n0 = [n=0]\\ \strb n1 &=& [n>0]\\ \stra n1 &=& (n-1)![n>0]\\ \strb n2 &=& (2^{n-1}-1)[n>0]\\ \stra n2 &=& (n-1)!\left (\sum_{i=1}^{n-1}\frac 1i \right )[n>0]\\ \strb n {n-1} &=& \stra n {n-1} = \bino n2\\ \strb nn &=& \stra nn =\bino nn = 1\\ \strb nk &=& \stra nk = \bino nk = 0 , k > n \\ \end{eqnarray*} $$
在冪之間轉換:
$$ \begin {eqnarray*} x^n &=& \sum_{k=0}^{n} \strb nk x^\udl{k}=\sum_{k=1}^n \strb nk (-1)^{n-k} x^\ovl{k}\\ x^\udl n &=& \sum_{k=0}^{n} \stra nk (-1)^{n-k} x^k\\ x^\ovl n &=& \sum_{k=0}^{n} \stra nk x^k \end {eqnarray*} $$
反轉公式:
$$ \begin {eqnarray*} \sum_{k=1}^n \stra nk \strb km (-1)^{n-k} &=& [m=n]\\ \sum_{k=1}^n \strb nk \stra km (-1)^{n-k} &=& [m=n] \end {eqnarray*} $$
其他斯特林數恆等式:
$$ \begin {eqnarray*} \strb{n+1}{m+1}&=&\sum_{k=1}^n \bino nk \strb km \\ \stra{n+1}{m+1}&=&\sum_{k=1}^n \stra nk \bino km \\ \strb nm &=& \sum_{k=1}^n \bino nk \strb{k+1}{m+1} (-1)^{n-k}\\ \stra nm &=& \sum_{k=1}^n \stra {n+1}{k+1}\bino km (-1)^{m-k}\\ m!\strb nm &=& \sum_{k=1}^n \bino mk k^n (-1)^{m-k}\\ \strb {n+1}{m+1} &=& \sum_{k=0}^{n} \strb km (m+1)^{n-k}\\ \stra {n+1}{m+1} &=& \sum_{k=0}^n \stra km n^\udl {n-k} = n! \sum_{k=0}^n \frac{\left [ ^{\ k\ }_{\ m} \right ]}{k!}\\ \strb {m+n+1}m &=& \sum_{k=0}^m k \strb {n+k}k\\ \stra {m+n+1}m &=& \sum_{k=0}^m (n+k) \stra {n+k}k\\ \bino nm &=& \sum_{k=1}^n \strb {n+1}{k+1}\stra km (-1)^{m-k}\\ n^\udl{n-m}[n\geq m]&=& \sum_{k=1}^n \stra {n+1}{k+1}\strb km (-1)^{m-k}\\ \strb {n}{n-m} &=& \sum_{k=1}^n \bino{m-n}{m+k}\bino {m+n}{n+k}\stra {m+k}{k}\\ \stra {n}{n-m} &=& \sum_{k=1}^n \bino{m-n}{m+k}\bino {m+n}{n+k}\strb {m+k}{k}\\ \strb {n}{l+m} \bino {l+m}{l} &=& \sum_{k=1}^n \strb kl \strb {n-k}m \bino nk \\ \stra {n}{l+m} \bino {l+m}{l} &=& \sum_{k=1}^n \stra kl \stra {n-k}m \bino nk \end {eqnarray*} $$
證明:
數學歸納及推式子。我比較菜,推的式子都好長。有木有大佬能教教我簡單一點的方法?
(1)
$$ \begin{eqnarray*} \strb{n+1}{m+1}&=&\sum_{k=1}^n \bino nk \strb km \\ 解:\strb{n+1}{m+1}&=&(m+1)\strb{n}{m+1}+\strb nm \\ &=&\strb nm + (m+1) \sum_{k=1}^{n-1}\bino{n-1}k \strb km \\ &=&\strb nm + \sum_{k=1}^{n-1}\bino {n-1}k \strb km + m \sum_{k=1}^{n-1}\bino{n-1}k \strb km \\ &=&\strb nm + \sum_{k=1}^{n-1}\bino nk \strb km - \sum_{k=1}^{n-1} \bino {n-1}{k-1} \strb km + m \sum_{k=1}^{n-1}\bino{n-1}k \strb km \\ &=&\sum_{k=1}^{n}\bino nk \strb km - \sum_{k=1}^{n-1}\bino {n-1}{k-1} \left ( \strb{k-1}{m-1}+m \strb {k-1}m \right ) + \cdots \\ &=&\cdots -\sum_{k=0}^{n-2}\bino {n-1}k \left ( \strb k{m-1}+m\strb km \right ) + m\sum_{k=0}^{n-1}\bino {n-1}k \strb km \\ &=&\cdots + m\strb{n-1}m - \sum_{k=0}^{n-2}\bino{n-1}k \strb k{m-1} \\ &=&\cdots +\strb nm - \strb {n-1}{m-1} - \sum_{k=0}^{n-2}\bino{n-1}k \strb k{m-1} \\ &=&\cdots +\strb nm - \sum_{k=0}^{n-1}\bino{n-1}k \strb k{m-1} \\ &=&\cdots + 0 = \sum_{k=1}^n \bino nk \strb km \end{eqnarray*} $$
(2)
$$ \begin{eqnarray*} \stra{n+1}{m+1}&=&\sum_{k=1}^{n} \stra nk \bino km \\ 解:\stra{n+1}{m+1}&=&\stra nm + n \stra n{m+1}\\ &=&\stra nm + \sum_{k=1}^{n-1} n\stra {n-1}k \bino km \\ \because (n-1)\stra{n-1}k&=&\stra nk - \stra {n-1}{k-1}\\ \therefore 原式 &=&\stra nm + \sum_{k=1}^{n-1}\left ( \stra nk -\stra {n-1}{k-1}+\stra {n-1}k \right )\bino km\\ &=& \stra nm - \bino nm + \sum_{k=1}^{n} \stra nk \bino km + \sum_{k=1}^{n-1}\left ( \stra {n-1}k - \stra {n-1}{k-1} \right )\bino km\\ &=& \cdots + \sum_{k=1}^{n-1}\left ( \stra {n-1}k - \stra {n-1}{k-1} \right )\bino km\\ &=& \cdots + \bino {n-1}m - \sum_{k=1}^{n-2} \stra {n-1}k \left ( \bino {k-1}m - \bino km \right )\\ &=& \cdots + \bino {n-1}m - \sum_{k=1}^{n-2} \stra {n-1}k \bino k{m-1}\\ &=& \cdots + \bino {n-1}m + \bino {n-1}{m-1} - \sum_{k=1}^{n-1} \stra {n-1}k \bino k{m-1}\\ &=& \cdots + \bino nm - \stra nm \\ &=& \sum_{k=1}^n \stra nk \bino km \end{eqnarray*} $$
(3)
$$ \begin{eqnarray*} \strb nm &=& \sum_{k=1}^{n} \bino nk \strb{k+1}{m+1} (-1)^{n-k}\\ 解:\strb nm &=& \strb{n+1}{m+1} - (m+1) \strb n {m+1} \\ &=&\sum_{k=1}^{n+1}\bino {n+1}k \strb{k+1}{m+2}(-1)^{n-k+1} - (m+1) \sum_{k=1}^n \bino nk \strb {k+1}{m+2}(-1)^{n-k}\\ &=&\sum_{k=1}^n \left ( \bino {n+1}k - \bino nk \right ) \strb {k+1}{m+2} (-1)^{n-k+1}+\strb{n+2}{m+2} \\&&\ \ \ \ -(m+2)\sum_{k=1}^n \bino nk \strb {k+1}{m+2}(-1)^{n-k}\\ &=&\sum_{k=1}^n \bino n {k-1}\strb {k+1}{m+2}(-1)^{n-k+1}+\strb{n+2}{m+2}-(m+2)\times \cdots \\ &=&\sum_{k=0}^n \bino nk \strb{k+2}{m+2}(-1)^{n-k} - (m+2) \sum_{k=1}^n \bino nk \strb {k+1}{m+2}(-1)^{n-k} \\ &=&\sum_{k=1}^n \bino nk \strb{k+2}{m+2}(-1)^{n-k} - (m+2) \sum_{k=1}^n \bino nk \strb {k+1}{m+2}(-1)^{n-k} \\ &=&\sum_{k=1}^n \bino nk \left ( \strb {k+2}{m+2}-(m+2)\strb{k+1}{m+2}\right )(-1)^{n-k}\\ &=&\sum_{k=1}^n \bino nk \strb {k+1}{m+1} (-1)^{n-k}\\ &&然后您仔細一看發現我的這個數學歸納是假的????\\ &&沒錯,是假的,因為這樣歸納下去就沒有終點了。但是,這個推導可以表明一點:\\ &&在證明第一行的三個斯特林數中,如果兩個滿足了要求證明的性質,那么第三個也滿足。\\ &&這說明我們只需要用 \strb {n}{m} 和 \strb n{m+1} 來歸納證明\strb{n+1}{m+1}就可以了。\\ &&具體來說,就是移個項。 \end{eqnarray*} $$
剩下的式子就留(gu)給(gu)讀(gu)者了。
鳴謝
感謝《具體數學》。
陳老爺太強了。已經秒掉了此博文的所有內容。