定義
第一類斯特林數\(s(n,m)\)表示把\(n\)個不同元素放到\(m\)個相同圓排列里的方案數。
有轉移方程:
\[s(n,m)=s(n-1,m-1)+(n-1)\times s(n-1,m) \]
第二類斯特林數\(S(n,m)\)表示把\(n\)個不同元素放到\(m\)個相同集合里的方案數。
有轉移方程:
\[S(n,m)=S(n-1,m-1)+m\times S(n-1,m) \]
還有一些我自己的定義:
\(x\)的\(n\)次下降冪\(x_{(n)}=\prod_{i=0}^{n-1} (x-i)\)。
\(x\)的\(n\)次上升冪\(x^{(n)}=\prod_{i=0}^{n-1} (x+i)\)。
(只是因為我不會LaTeX寫這東西而已)
求法
第一類斯特林數
求一行
有一個式子:
\[\sum_{k=0}^n s(n,k)x^k=\prod_{i=0}^{n-1}(x+i)=x^{(n)} \]
利用數學歸納法來證明:
\[\begin{align*} &x^{(n+1)}\\ =&(x+n)\sum_{i=0}^n s(n,i)x^i\\ =&\sum_{i=0}^{n+1}(s(n,i-1)+n\times s(n,i))x^i\\ =&\sum_{i=0}^{n+1}s(n+1,i)x^i \end{align*} \]
直接暴力分治FFT可以做到\(O(n\log^2 n)\),但還可以更好。
設
\[F_n(x)=\prod_{i=0}^{n-1}(x+i)=x^{(n)} \]
由於\(F_{2n}(x)=F_n(x)F_n(x+n)\),所以求解\(F_{2n}(x)\)時,可以先求出
\[F_n(x)=\sum_{i=0}^n a_ix^i \]
那么就有
\[\begin{align*} F_n(x+n)&=\sum_{i=0}^n a_i(x+n)^i\\ &=\sum_{i=0}^n a_i\sum_{k=0}^i x^kn^{i-k}{i\choose k}\\ &=\sum_{k=0}^nx^k\frac{1}{k!}\sum_{i=k}^n a_i i!n^{i-k}\frac 1{(i-k)!} \end{align*} \]
后面顯然是個卷積的形式,可以FFT求出來。
兩邊都有之后就可以乘在一起了。復雜度\(O(n\log n)\)。
求一列
同樣是生成函數,把\(n\)個球丟進一個圓排列的方案數的質數生成函數是
\[\sum_{n>0} (n-1)!\frac{1}{n!}x^n \]
那么丟進\(m\)個無序圓排列就是
\[\frac 1 {m!}(\sum_{n>0} (n-1)!\frac{1}{n!}x^n)^m \]
然后多項式快速冪。
第二類斯特林數
求一行
由組合意義可得
\[n^m=\sum_{k=0}^m k!{n\choose k} S(m,k) \]
等價於
\[n^m=\sum_{k=0}^n k!{n\choose k} S(m,k) \]
二項式反演,得
\[k!S(m,k)=\sum_{i=0}^k i^m(-1)^{k-i}{k\choose i} \]
(上式直接容斥也可以得到相同結果)
可以發現展開之后就是一個卷積,暴力FFT即可。
求一列
等價於分成\(m\)個集合不變,丟\(n\)個球進去,使得集合非空。
考慮\(n\)個球放入一個集合中的方案數的指數生成函數,就是
\[\sum_{n} [n\ne 0]\frac{1}{n!}x^n \]
也就是
\[e^x-1 \]
那么\(m\)個不同集合,生成函數就是
\[(e^x-1)^m \]
由於集合無序,所以變成
\[\frac 1 {m!}(e^x-1)^m \]
然后可以多項式快速冪。
斯特林反演
這里丟個式子,並不打算證明qwq
\[f_n=\sum_{k=0}^n s(n,k)g_k\Leftrightarrow g_n=\sum_{k=0}^n (-1)^{n-k}S(n,k)f_k \]
斯特林數與上升、下降、普通冪的關系
首先有上升下降冪之間的轉化:
\[x^{(n)}=(-1)^n (-x)_{(n)}\\ x_{(n)}=(-1)^n(-x)^{(n)} \]
較為顯然,不證明。
然后有上面一個式子:
\[x^{(n)}=\sum_{i=0}^n s(n,i)x^i \]
反演得到
\[x^n=\sum_{i=0}^n (-1)^{n-i}S(n,i)x^{(i)} \]
上升和下降轉化一下得到
\[x_{(n)}=\sum_{i=0}^n s(n,i)x^{i}(-1)^{n-i} \]
把\(x\)替換為\(-x\)又可以得到
\[x^n=\sum_{i=0}^n S(n,i)x_{(i)} \]
諸如此類……
總結一下,應該都是普通轉上升/下降時用第二類,上升/下降轉普通時用第一類。這也許和斯特林數最基本的定義有關。
其他一些可能有用的東西
\[S(n+1,m+1)=\sum_k{n\choose k}S(k,m) \]
利用組合意義很容易理解。
\[s(n+1,m+1)=\sum_k s(n,k){k\choose m} \]
這個學長不知道怎么組合意義,那我更不會了qwq
update:會了。
考慮后面的式子的意義,就是選出一些元素組成 \(m\) 個圓排列,剩下的隨便搞。
那么就等價於加入一個特殊元素,分成 \(m+1\) 個圓排列,其中沒有特殊元素的圓排列就是需要的 \(m\) 個圓排列,剩下的從特殊元素這里斷開,可以對應到一個排列,而眾所周知一個排列即可對應到任意組合的圓排列。