斯特林數小結(update gradually...)

概念

  • 斯特林數(Stirling number)是由18世紀數學家James Stirling提出的兩類數。
  • 第一類:輪換數,將n個數排成k個非空的環(圓排列,有序)的方案數,用s(n,m)s(n,m)[nk]\left[ \begin{matrix}n\\k\end{matrix} \right]表示。還分爲無符號第一類斯特林數su(n,m)s_u(n,m)和帶符號第一類斯特林數 ss(n,m)s_s(n,m)
  • 第二類:子集數,將n個數排成k個非空集合(集合內無序)的方案數,用S(n,m)S(n,m){nk}\left\{ \begin{matrix}n\\k\end{matrix} \right\}表示。

第一類斯特林數

邊界條件&&遞推式

  • 先考慮無符號第一類斯特林數su(n,m)s_u(n,m)
  • 根據定義,易得邊界條件:
    s(n,k)={0n<k1n=k0n>0  k=0s(n,k)=\begin{cases}0 & n<k \\ 1 & n=k \\ 0 & n>0\ ∧\ k=0 \end{cases}
  • 假設現在已知s(n1,k1)s(n-1,k-1),我們要加入一個新數nn。它可以考慮自己形成一個新的環,或者插入任意一個已有的數後面,因此:[nk]=[n1k1]+(n1)[n1k]\left[ \begin{matrix}n\\k\end{matrix} \right]=\left[ \begin{matrix}n-1\\k-1\end{matrix} \right]+(n-1)\left[ \begin{matrix}n-1\\k\end{matrix} \right]
  • 有符號的第一類斯特林數ss(n,k)s_s(n,k)與此類似。其遞推式爲:ss(n,k)=(1)n+ksu(n,k)=ss(n1,k1)(n1)×ss(n1,k)s_s(n,k)=(-1)^{n+k}s_u(n,k)=s_s(n-1,k-1)-(n-1)\times s_s(n-1,k)
  • 時間&空間複雜度:O(n2)O(n^2)

與上升/下降冪的關係

  • 第一類斯特林數與上升冪xn=x(x+1)(x+2)(x+n1)x^{\overline{n}}=x(x+1)(x+2)\cdots(x+n-1)滿足如下所示的關係:
    xn=k=1nsu(n,k)×xkx^{\overline{n}}=\sum_{k=1}^n s_u(n,k)\times x^k
  • 亦即第一類斯特林數表現爲xnx^{\overline{n}}的展開形式的各項係數。
  • 該式子可利用su(n,m)s_u(n,m)的遞推式通過數學歸納法來證明。但其亦有簡單的組合意義:
  • nn個點,構成若干個環,要求一個環中所有點顏色相同,不同環不作要求。那麼我們可以枚舉環的組成(k=1nsu(n,k)\sum_{k=1}^n s_u(n,k)),再給每個環分配顏色(xkx^k);從另一個角度想,我們按編號從小到大加入每個點,每個點可在x種顏色中選擇一種並自己形成一個新的環,亦可在前n1n-1個點中選擇一個點接在它後面並繼承它的顏色,那麼操作方案數即爲xnx^{\overline{n}}

  • 上式加以變形可得到與下降冪xn=x(x1)(x2)(xn+1)x^{\underline{n}}=x(x-1)(x-2)\cdots(x-n+1)的關係:
    xn=k=1n(1)nk×su(n,k)×xk=k=1nss(n,k)×xkx^{\underline{n}}=\sum_{k=1}^n (-1)^{n-k}\times s_u(n,k)\times x^k=\sum_{k=1}^n s_s(n,k)\times x^k
  • 這是因爲我們把xnx^{\underline{n}}展開後,會發現它的各項係數的絕對值與xnx^{\overline{n}}一致,只是正負性會交錯排列。

較爲快速的求法

  • 考慮多項式F(x)=i=0n1(x+i)F(x)=\prod_{i=0}^{n-1}(x+i)的係數。
  • F(x)=xn=k=1n[kn]xk=k=0n[kn]xkF(x)=x^{\overline{n}}=\sum_{k=1}^n\left[ ^n_k \right]x^k=\sum_{k=0}^n\left[ ^n_k \right]x^k
  • 因此,F(x)F(x)的k次項係數即爲[kn]\left[^n_k\right]

  • 考慮快速地求解[kn]\left[^n_k\right]
  • 當有模數的時候,可以分治NTT求解F(x)F(x)的各項係數(可以忽略掉i=0i=0時的(x+i)(x+i))。我們進行CDQ分治,區間[2l1,2r][2l-1,2r]表示(x+l)(x+l+1)(x+l+2)(x+r)(x+l)(x+l+1)(x+l+2)\cdots(x+r)的各項係數。記m=l+r2m=\dfrac{l+r}2,每次先求解區間[2l1,2m][2l-1,2m]和區間[2m+1,2r][2m+1,2r],爾後再合併。
  • 時間複雜度:O(nlog22n)O(n\log_2^2n);空間複雜度:O(n)O(n)

第二類斯特林數

回顧一下定義

  • 第二類斯特林數:子集數,將n個數排成k個非空集合(集合內無序)的方案數,用S(n,m)S(n,m){nk}\left\{ \begin{matrix}n\\k\end{matrix} \right\}表示。

邊界條件&&遞推式

  • 隨便思考一下即可發現,邊界條件與第一類斯特林數一致:
    S(n,k)={0n<k1n=k0n>0  k=0S(n,k)=\begin{cases}0 & n<k \\ 1 & n=k \\ 0 & n>0\ ∧\ k=0 \end{cases}
  • 假設現在已知S(n1,k1)S(n-1,k-1),要加入新數nn。它可以自己形成一個新的集合,或者加進先前已有的任意一個集合中去,於是:{nk}={n1k1}+k{n1k}\left\{ \begin{matrix}n\\k\end{matrix} \right\}=\left\{ \begin{matrix}n-1\\k-1\end{matrix} \right\}+k\left\{ \begin{matrix}n-1\\k\end{matrix} \right\}
  • 時間&空間複雜度:O(n2)O(n^2)

與下降冪的關係

  • 第二類斯特林數與下降冪xkx^{\underline{k}}滿足如下所示的關係:
    xn=k=0nS(n,k)×xkx^n = \sum_{k=0}^{n} S(n,k)\times x^{\underline{k}}
  • 與前面的一樣,這個式子可以用數學歸納法證明,亦有組合意義:
  • 假設我們用xx種顏色爲nn個點染色,方案數顯然是xnx^n;而我們也可以枚舉同種顏色的集合是什麼(k=0nS(n,k)\sum_{k=0}^{n} S(n,k)),然後從x種顏色中選出不同的顏色賦給這些集合(xkx^{\underline{k}})。

通項公式

  • 轉換模型。不難發現S(n,k)S(n,k)等價於:將nn個不同的球放入mm個無差別的盒子中,要求盒子非空的方案數。
  • 我們先考慮盒子有差別的情況。
  • 考慮容斥。枚舉空盒數ii,在mm個盒子中選ii個即爲(mi)\binom mi;那麼,nn個球可以放進剩下的mim-i個盒子中,即爲(mi)n(m-i)^n。容斥係數顯然爲(1)i(-1)^i。(當然,嚴謹證明還是得推式子)
  • 最後,消除盒子的差別,整體乘上一個1m!\frac1{m!}

  • 以上說明過於感性,下面我們來理性一下。
  • 我們之前已經得出了:mn=i=0n{in}mim^n=\sum_{i=0}^n \left\{ ^n_i\right\}m^{\underline{i}}
  • mim^{\underline{i}}拆開來就變成:i=0n(nk){kn}x!\sum_{i=0}^n \binom nk\left\{^n_k\right\}x!
  • 那麼,根據二項式反演,上式等價於:{mn}m!=i=0m(1)i(mi)(mi)n\left\{^n_m\right\}m!=\sum_{i=0}^m(-1)^i\binom mi (m-i)^n
  • 然後,我們把m!m!丟到右邊去。

  • 至此,我們得到了第二類斯特林數的通項公式:
    {nm}=1m!i=0m(1)i(mi)(mi)n=i=0m(1)i(mi)ni!(mi)!\begin{Bmatrix}n\\m\end{Bmatrix}=\frac 1 {m!}\sum_{i=0}^m(-1)^i\binom mi(m-i)^n=\sum_{i=0}^m\frac{(-1)^i(m-i)^n}{i!(m-i)!}
  • 可以考慮預處理1i!(mi)!\frac1{i!(m-i)!}。單組詢問的話,也可以預處理(mi)n(m-i)^n
  • 時間複雜度:O(mlogM)O(m\log M)O(m)O(m)。(MM爲模數)
  • 如果我們要快速地求S(n,0)S(n,m)S(n,0)\sim S(n,m)怎麼破?我們發現通項公式中,(1)ii!\frac{(-1)^i}{i!}只與ii有關,(mi)n(mi)!\frac{(m-i)^n}{(m-i)!}只與mim-i有關。所以可設兩個多項式,用一個FFT/NTT,即可在O(mlogm)O(m\log m)的時間內求出。

與自然數冪和

  • 第二類斯特林數的一大亮點是可以快速求自然數冪和。
  • F(n)=i=1nikF(n)=\sum_{i=1}^n i^k。我們來現場推一波式子:
    F(n)=i=1nj=0k{kj}ij=i=1nj=0k{kj}j!(ij)=j=0k{kj}j!i=jn(ij)\begin{aligned} F(n) & = \sum_{i=1}^{n} \sum_{j=0}^{k} \left\{ \begin{matrix}k\\j\end{matrix} \right\} i^{\underline{j}} \\ & = \sum_{i=1}^{n} \sum_{j=0}^{k} \left\{ \begin{matrix}k\\j\end{matrix} \right\} j!\left( \begin{matrix}i\\j\end{matrix}\right) \\ & = \sum_{j=0}^{k} \left\{ \begin{matrix}k\\j\end{matrix} \right\} j! \sum_{i=j}^n \left( \begin{matrix}i\\j\end{matrix}\right) \end{aligned}
  • 現在已經可以O(nk)O(nk)求解了。但是我們想更快。

  • 先給出一個結論:i=jn(ji)=(j+1n+1)\sum_{i=j}^n\left( ^i_j\right)=\left(^{n+1}_{j+1} \right)
  • 這個東西的證明,可以根據組合數的遞推式依次展開(j+1n+1)\left(^{n+1}_{j+1} \right)來得到:
    (n+1j+1)=(nj)+(nj+1)=(nj)+(n1j)+(n1j+1)=(nj)+(n1j)+(n2j)+(n2j+1)=(nj)+(n1j)++(jj)+(jj+1)=(nj)+(n1j)++(jj)\begin{aligned} \left( \begin{matrix}n+1\\j+1\end{matrix}\right) & =\left( \begin{matrix}n\\j\end{matrix}\right) + \left( \begin{matrix}n\\j+1\end{matrix}\right) \\& =\left( \begin{matrix}n\\j\end{matrix}\right) + \left( \begin{matrix}n-1\\j\end{matrix}\right) + \left( \begin{matrix}n-1\\j+1\end{matrix}\right) \\& =\left( \begin{matrix}n\\j\end{matrix}\right) + \left( \begin{matrix}n-1\\j\end{matrix}\right) + \left( \begin{matrix}n-2\\j\end{matrix}\right) + \left( \begin{matrix}n-2\\j+1\end{matrix}\right) \\& =\left( \begin{matrix}n\\j\end{matrix}\right) + \left( \begin{matrix}n-1\\j\end{matrix}\right) + \cdots + \left( \begin{matrix}j\\j\end{matrix}\right) + \left( \begin{matrix}j\\j+1\end{matrix}\right)\\& =\left( \begin{matrix}n\\j\end{matrix}\right) + \left( \begin{matrix}n-1\\j\end{matrix}\right) + \cdots + \left( \begin{matrix}j\\j\end{matrix}\right) \end{aligned}
  • 也可以考慮組合意義:n+1n+1個數排成一排,選j+1j+1個,枚舉第一個數選的位置,剩下的數再選jj個,於是就成了上面的式子。

  • 然後我們可以繼續化簡。
  • 接着上面的隊形:
    F(n)=j=0k{kj}j!i=jn(ij)=j=0k{kj}j!(n+1j+1)=j=0k{kj}(n+1)j+1j+1\begin{aligned} F(n) & = \sum_{j=0}^{k} \left\{ \begin{matrix}k\\j\end{matrix} \right\} j! \sum_{i=j}^n \left( \begin{matrix}i\\j\end{matrix}\right) \\& = \sum_{j=0}^{k} \left\{ \begin{matrix}k\\j\end{matrix} \right\} j!\left( \begin{matrix}n+1\\j+1\end{matrix}\right)\\& = \sum_{j=0}^k\left\{\begin{matrix}{k}\\{j}\end{matrix}\right\} \frac{(n+1)^{\underline {j+1}}}{j+1} \end{aligned}
  • {jk}\left\{ ^k_j\right\}的值可以O(k2)O(k^2)O(klogk)O(k\log k)預處理。而(n+1)j+1(n+1)^{\underline{j+1}}是連續的j+1j+1個自然數的乘積,則其一定是j+1j+1的倍數,因此不必逆元。(當然,假如(n+1)(n+1)太大,要先模,那就得逆元了)逆元可以O(k)O(k)預處理,因此單次詢問複雜度爲O(k)O(k)

兩類斯特林數之間的關係

i=0nS(n,i)s(i,m)=i=0ns(n,i)S(i,m)\sum_{i=0}^nS(n,i)s(i,m)=\sum_{i=0}^ns(n,i)S(i,m)

  • 這是爲什麼呢?我覺得應該可以數學歸納法,在此不作證明。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章