二項式反演、斯特林反演、莫比烏斯反演、第一類斯特林數、第二類斯特林數。數組
首先咱們有兩個數列\(\{f_i\}\)和數列\(\{g_i\}\),他們之間知足
\[g_n=\sum_{i=0}^n a[n][i]f_i\]
這裏咱們能夠經過\(\{f_i\}\)的值推出\(\{g_i\}\)。
那麼反演過程就是找到一個數組\(b\),使得可以用\(\{g_i\}\)的值,反推出\(\{f_i\}\)的值。
也就是
\[f_n=\sum_{i=0}^n b[n][i]g_i\]
若是隻經過上面兩個式子來考慮的話,事實上這就是一個反解線性方程組的過程,然而實際上整個方程組已是一個下三角的形式了,所以咱們能夠考慮更加快捷的方式來進行計算。函數
這裏給出克羅內克函數
\[\delta(i,j)=\begin{cases}1&i=j\\0&i\neq j\end{cases}\]
只是爲了後面的書寫的方便而介紹這個函數。spa
考慮反演的過程
\[f_n=\sum_{i=0}^n b[n][i]g_i\]
咱們把\(g_i\)的計算式直接帶入當前式子,那麼就會獲得:
\[\begin{aligned}f_n=\sum_{i=0}^n b[n][i]g_i&=\sum_{i=0}^n b[n][i]\sum_{j=0}^ia[i][j]f_j\\&=\sum_{i=0}^n f_i\sum_{j=i}^nb[n][j]*a[j][i]\end{aligned}\]
考慮每個\(f_i\)前面的係數,顯然只有\(f_n\)的係數爲\(1\)。
所以\(a,b\)之間的關係能夠簡單的寫成。
\[\sum_{j=i}^nb[n][j]*a[j][i]=\delta(n,i)\]
同理,把\(f\)帶入到\(g\)的求和式中,能夠推出
\[\sum_{j=i}^na[n][j]*b[j][i]=\delta(n,i)\]遞歸
若是知足這兩個式子的話,那麼意味着反演也是成立的。
然而這樣子很虛幻,由於看起來也不知道有什麼用,那麼接下來就帶入具體的東西來寫QwQ。數學
這個玩意彷佛常常在容斥裏面用到,或者說本質上就是一個容斥。
它的式子能夠寫成這個樣子:
\[\begin{aligned}f_n&=\sum_{i=0}^n(-1)^i{n \choose i}g_i\\g_n&=\sum_{i=0}^n(-1)^i{n\choose i}f_i\end{aligned}\]
正反看起來是如出一轍的。
或者說寫成更加常見的一種形式
\[\begin{aligned}f_n&=\sum_{i=0}^n{n\choose i}g_i\\g_n&=\sum_{i=0}^n(-1)^{n-i}{n\choose i}f_i\end{aligned}\]
證實的話直接相似前面把\(f_i\)帶入\(g_n\)的求和式之中,經過組合數的化簡便可簡單的證實。
\[\begin{aligned}g_n&=\sum_{i=0}^n(-1)^{n-i}{n\choose i}f_i\\&=\sum_{i=0}^n(-1)^{n-i}{n\choose i}\sum_{j=0}^i{i\choose j} g_j\\&=\sum_{j=0}^n g_i\sum_{i=j}^n{n\choose i}{i\choose j}(-1)^{n-i}\\&=\sum_{j=0}^n g_j\sum_{i=j}^n{n\choose j}{n-j\choose i-j}(-1)^{n-i}\\&=\sum_{j=0}^n g_j({n\choose j}\sum_{i=j}^n{n-j\choose i-j}(-1)^{n-i})\\&=\sum_{j=0}^n g_j({n\choose j}\sum_{i=0}^{n-j}{n-j\choose i}(-1)^{n-j-i})\\&=\sum_{j=0}^n g_j({n\choose j}(1-1)^{n-j})\\&=g_n\end{aligned}\]class
固然,還能夠寫成這個樣子:
\[ \begin{aligned} f_k&=\sum_{i=k}^n{i\choose k}g_i\\ g_k&=\sum_{i=k}^n{i\choose k}f_i(-1)^{i-k} \end{aligned} \]
證實同理。方法
求徹底錯位的排列方案數,即不存在\(p_i=i\)的排列\(\{p\}\)的個數。im
這個是有遞推作法的,可是由於這裏在寫二項式反演,因此不考慮其餘的作法。
設\(f_i\)表示剛好有\(i\)個位置時知足不存在\(p_k=k\)的方案數,也就是答案。
那麼咱們推出一個式子:
\[n!=\sum_{i=0}^n{n\choose i}f_i\]
即枚舉哪些位置知足\(p_k=k\),剩下位置強制知足錯排關係,這樣子就可以不重不漏的計算出\(n!\)個排列。
這樣一來令\(g_n=n!\),有二項式反演的式子:
\[f_n=\sum_{i=0}^n(-1)^{n-i}{n\choose i}g_i=n!\sum_{i=0}^n\frac{(-1)^i}{i!}\]總結
有\(1\times n\)的一排格子,有\(m\)種顏色,每一個格子染一個顏色,相鄰格子顏色不能相同,每種顏色都至少被用到\(1\)次,求染色方案數。di
若是不考慮每一個顏色都要被用一次的話,答案顯然就是\(m*(m-1)^{n-1}\),這樣也就是至多用了\(m\)種顏色。
設\(f_i\)表示剛好用了\(i\)種顏色的方案數,那麼與之對應的設\(g_i\)表示至多用了\(i\)種顏色的方案數。
那麼咱們推出一個轉移:
\[g_m=m*(m-1)^{n-1}=\sum_{i=0}^n {n\choose i}f_i\]
二項式反演獲得:
\[f_m=\sum_{i=0}^m(-1)^{m-i}{m\choose i}g_i\]
其餘還有些題目之類的東西懶得寫了QwQ。
\(\begin{bmatrix}n\\m\end{bmatrix}\)表示\(n\)個元素分紅\(m\)個環的方案數。
那麼遞推式很顯然:
\[\begin{bmatrix}n\\m\end{bmatrix}=\begin{bmatrix}n-1\\m-1\end{bmatrix}+(n-1)*\begin{bmatrix}n-1\\m\end{bmatrix}\]
即考慮先前已經放好的\(n-1\)個數,當前新加入的這個元素有兩種選擇,第一種是本身成一個環,貢獻是\(\begin{bmatrix}n-1\\m-1\end{bmatrix}\);第二種是放到環內,那麼它能夠放在任意一個數的前面,因此就是\((n-1)*\begin{bmatrix}n-1\\m\end{bmatrix}\)。
爲了好寫,接下來可能就偷懶寫成\(S_1(n,m)\)了。
這幾個式子仍是頗有用的,揭示了第一類斯特林數和降低冪之間的關係,而降低冪很明顯能夠寫成排列的形式,也說明了第一類斯特林數和組合計數之間有着緊密的聯繫。
第一類斯特林數的生成函數能夠寫成:
\[\sum_{i=0}^n S_1(n,i)x^i=\prod_{i=0}^{n-1}(x+i)\]
獲得的方法很簡單,把\(n\)爲定值時的全部的第一類斯特林數按照\(n\)分類分紅行,發現每次的\(S_1(n,m)\)轉移一定要從\(n-1\)行轉移過來,而每次轉移都是\(m-1\)變到\(m\),係數爲\(1\),所以有一項\(x\),同理有一項\(n-1\),所以就能夠獲得上面的那個生成函數。
考慮如何預處理整行第一類斯特林數,用上述式子能夠直接分治+\(FFT\)作到\(O(nlog^2n)\)。
實際上有一種只須要一個\(log\)的倍增方法。(問了lun終於懂了)
令\(\displaystyle F_n(x)=\prod_{i=0}^{n-1}(x+i)\),則有\(F_{2n}(x)=F_n(x)F_{n}(x+n)\)。
\(F_n(x)\)咱們遞歸求得其答案,如今考慮如何利用\(F_n(x)\)快速求出\(F_n(x+n)\)。
在這裏咱們假設\(\displaystyle F_n(x)=\sum_{i=0}^{n-1} a_i x^i\)
\[\begin{aligned} F_n(x+n)&=\sum_{i=0}^{n-1}a_i (x+n)^i\\ &=\sum_{i=0}^{n-1}a_i\sum_{j=0}^i{i\choose j}n^{i-j}x^j\\ &=\sum_{i=0}^{n-1}(\sum_{j=i}^n {j\choose i}n^{j-i}a_j)x^i \end{aligned}\]
括號內的部分拆開以後,能夠分紅差相等的兩個部分,意味着能夠翻轉以後卷積。
那麼每次遞歸前一半,後面一半卷積求解便可獲得答案。
時間複雜度爲一個\(log\)。
這個其實原來我寫過一次啦QwQ。
\(\begin{Bmatrix}n\\m\end{Bmatrix}\)表示將\(n\)個元素放入\(m\)個相同盒子裏,每一個盒子非空的方案數。
遞推式和上面相似
\[\begin{Bmatrix}n\\m\end{Bmatrix}=\begin{Bmatrix}n-1\\m-1\end{Bmatrix}+m*\begin{Bmatrix}n-1\\m\end{Bmatrix}\]
考慮最後放入的元素是新建一個盒子仍是放入一個原有的盒子便可。
後面偷懶寫成\(S_2(n,m)\)的形式。
上述式子是直接遞推,事實上第二類斯特林數有容斥計算的方法。
\[S_2(n,m)=\frac{1}{m!}\sum_{i=0}^m(-1)^i{m\choose i}(m-i)^n\]
即先將盒子編號,最後結果出去順序便可。考慮有幾個盒子爲空,枚舉出來,而後剩下的元素隨便放在非空的盒子裏,由於這裏算完以後是至少\(i\)個盒子爲空,因此須要容斥。
這個式子拆開組合數以後能夠寫成卷積的形式,意味着咱們能夠在一個\(log\)的複雜度裏求解\(S(n,i),i\in[0,n]\)。
這裏和天然數冪之間有一個式子
\[m^n=\sum_{i=0}^mS_2(n,i){m\choose i}i!\]
\(m^n\)理解爲把\(n\)個球任意放到\(m\)個有區別的盒子中,那麼咱們枚舉哪些盒子非空,而後放進去的方案數就是第二類斯特林數乘階乘。
固然,事實上上面的這個式子也能夠寫成上升冪和降低冪的形式
\[ \begin{aligned}m^n&=\sum_{i=0}^mS_2(n,i){m\choose i}i!\\&=\sum_{i=0}^mS_2(n,i)\frac{m!}{(m-i)!}\\&=\sum_{i=0}^mS_2(n,i)m^{\underline i}\end{aligned} \]
upd:補充一個天然數冪和的式子:
\[\begin{aligned} S(n)&=\sum_{i=1}^n i^k\\ &=\sum_{i=1}^n\sum_{j=0}^k \begin{Bmatrix}k\\j\end{Bmatrix}i^{\underline j}\\ &=\sum_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}\sum_{i=1}^ni^{\underline j}\\ &=\sum_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!\sum_{i=1}^n{i\choose j}\\ &=\sum_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}j!{n+1\choose j+1}\\ &=\sum_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}\frac{(n+1)^{\underline {j+1}}}{j+1} \end{aligned}\]
中間有一步\(\displaystyle \sum_{i=1}^n{i\choose j}={n+1\choose j+1}\),這個的證實能夠理解爲從\(n+1\)個位置中選擇\(j+1\)個位置,先肯定最靠左的那個求的位置,咱們枚舉其位置,這樣子剩下的位置就是\(n+1-i\)個,從中選出\(j\)個,就是上述式子了。
這樣子用第二類斯特林數計算天然數冪和就不須要考慮求逆的問題了。
直接擺式子吧
\[ \begin{aligned} f(n)&=\sum_{i=1}^n \begin{Bmatrix}n\\i\end{Bmatrix}g(i)\\ g(n)&=\sum_{i=0}^n(-1)^{n-i}\begin{bmatrix}n\\i\end{bmatrix}f(i)\end{aligned} \]
爲了證實這個東西咱們接下來能夠補一堆式子啦。
首先這個東西叫作反轉公式
\[\begin{cases}\sum_{k=m}^n(-1)^{n-k}\begin{bmatrix}n\\k\end{bmatrix}\begin{Bmatrix}k\\m\end{Bmatrix}=\delta(n,m)\\\sum_{k=m}^n(-1)^{n-k}\begin{bmatrix}k\\m\end{bmatrix}\begin{Bmatrix}n\\k\end{Bmatrix}=\delta(n,m)\end{cases}\]
仔細想一想,這不就是上面反演若是成立的話須要知足的兩個式子嗎?
因此只須要證實反轉公式成立,那麼相似前面的帶入方法,就能夠證實斯特林反演。
咱們先考慮幾個很顯然的式子就能夠很方便的幫忙證實反轉公式了。
\(x^{\underline n}=(-1)^n (-x)^{\overline n}\)
\(x^{\overline n}=(-1)^n (-x)^{\underline n}\)
這兩個式子很顯然,就不證實了。
接下來咱們就能夠來推式子了。
\[\begin{aligned} n^m&=\sum_{i=0}^m\begin{Bmatrix}m\\i\end{Bmatrix}n^{\underline i}\\ &=\sum_{i=0}^m\begin{Bmatrix}m\\i\end{Bmatrix}(-1)^i(-n)^{\overline i}\\ &=\sum_{i=0}^m\begin{Bmatrix}m\\i\end{Bmatrix}(-1)^i\sum_{j=0}^i \begin{bmatrix}i\\j\end{bmatrix}(-n)^j\\ &=\sum_{j=0}^m (-n)^j\sum_{i=j}^m\begin{Bmatrix}m\\i\end{Bmatrix}\begin{bmatrix}i\\j\end{bmatrix}(-1)^i\\ &=\sum_{j=0}^m n^j\sum_{i=j}^m\begin{Bmatrix}m\\i\end{Bmatrix}\begin{bmatrix}i\\j\end{bmatrix}(-1)^{i+j} \end{aligned}\]
顯然當且僅當\(j=m\)時後面那堆式子才爲\(1\)。
那麼就證實了反轉公式的一半,另一半顯然能夠同理證實。
這樣一來斯特林反演就證實完了。
能夠說是咱們最熟悉的反演了。主要用於和約數相關的關係。
\[ \begin{aligned} g(n)&=\sum_{d|n}f(d)\\ f(n)&=\sum_{d|n}g(d)\mu(\frac{n}{d}) \end{aligned} \]
證實,直接帶進去來爆算:
\[ \begin{aligned} g(n)&=\sum_{d|n}f(d)\\ &=\sum_{d|n}\sum_{dd|d}g(dd)\mu(\frac{d}{dd})\\ &=\sum_{dd|n}g(dd)\sum_{d|n,dd|d}\mu(\frac{d}{dd})\\ &=\sum_{dd|n}g(dd)\sum_{d|(n/dd)}\mu(d)\\ &=\sum_{dd|n}g(dd)\delta(n,dd)\\ &=g(n) \end{aligned} \]
這裏利用了\(\sum_{d|n}\mu(d)=\delta(n,1)\)
還有另一種形式,和二項式反演的另一種形式很相似。
\[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_{n|d}g(d)\mu(\frac{d}{n})\end{aligned}\]
證實方法相似。
單獨分開一篇總結QwQ