1. 程式人生 > >特殊計數序列——第一類斯特林(stirling)數

特殊計數序列——第一類斯特林(stirling)數

分開 ali 循環 第一條 理由 begin 方案 1-n 方法

第一類斯特林數

在這裏我因為懶所以還是用\(S(n,m)\)表示第一類斯特林數,但一定要和第二類斯特林數區分開來

遞推式

\(S(n,m)=S(n-1.m-1)+S(n-1,m)*(n-1)\)

其中\(S(0,0)=1,S(i,0)=0(i>0)\)

組合意義

\(n\)個元素組成\(m\)個圓排列的方案數

註意這裏圓排列指的是兩個排列經過旋轉能重合的算一種方案

那麽遞推式就可以這樣理解:對於當前的第\(n\)個元素,單獨成一個圓排列有\(S(n-1,m-1)\)種方案,放在其它的圓排列中有\(S(n-1,m)*(n-1)\)種方案,即放在每個元素的左側(右側等價於另一個元素的左側)

性質

1、\(S(n,1)=(n-1)!\)

圓排列定義

2、\(\sum_{i=1}^{n}S(n,i)=n!\)

我們知道\(1-n\)\(n\)個元素能形成\(n!\)個個排列,也就是\(n!\)個置換,而將置換寫成循環的形式,這又對應著一個圓排列,於是就建立起了\(n\)排列和第一類斯特林數一一對應的關系

3、\(x^\underline{n}=\sum_{i=0}^nS(n.i)(-1)^{n-i}x^i\)\(x^\overline{n}=\sum_{i=0}^nS(n,i)x^i\)

證明的話考慮數學歸納法,這裏僅給出第一條的證明
\[ \begin{aligned} x^{\underline{n+1}}=&(x-n)x^{\underline{n}}\=&(x-n)\sum_{i=0}^nS(n,i)(-1)^{n-i}x^i\=&\sum_{i=0}^nS(n,i)(-1)^{n-i}x^{i+1}-n\sum_{i=0}^nS(n,i)(-1)^{n-i}x^i\=&\sum_{i=1}^{n+1}S(n,i-1)(-1)^{n-i+1}x^i+n\sum_{i=0}^nS(n.i)(-1)^{n-i+1}x^i\=&\sum_{i=0}^{n+1}(S(n,i-1)+nS(n.i))(-1)^{n-i+1}x^i\=&\sum_{i=0}^{n+1}S(n+1,i)(-1)^{n-i+1}x^i \end{aligned} \]

求解第一類斯特林數

最普通的方法就是\(O(n^2)\)的遞推啦,考慮有沒有更優的方法

我們先丟結論:
\[ S(n,m)=[x^m]\prod_{i=0}^{n-1}(x+i) \]
計算右式的話可以使用分治+NTT在\(O(nlog^2n)\)的時間內解決,但是這麽做的理由是什麽?

設現在求的是\(S(n+1,m)\)我們記\(f_n(x)=\prod_{i=0}^{n-1}(x+1)\),然後把這個式子寫成類似於遞推的形式:
\[ f_{n+1}(x)=(x+n-1)f_n(x)=xf_n(x)+(n-1)f_n(x) \]
第一項\(xf_n(x)\)就相當於\(S(n+1,m-1)\)

,第二項\((n-1)f_n(x)\)就相當於\(n*S(n,m)\),也就是說這個式子對應的遞推式就是\(S(n+1,m)=S(n,m-1)+n*S(n,m)\),正確性也就顯然了

特殊計數序列——第一類斯特林(stirling)數