容斥學習筆記
容斥
錯排問題
\(n\)個人要站隊,每個人有編號,第\(i\)個人不能站在第\(i\)個位置,求方案數。
\(n \leqslant 1e5\)
設\(g[i]\)表示至少有\(i\)個人站對了的方案數,剩下的人亂站,那麼很顯然可以得到
\[ g[i]=(n-i)! \]
設\(f[i]\)表示恰好有\(i\)個人站對了的方案數,然後根據容斥亂猜以及理(bu)性(xiang)分(zheng)析(ming),可以得到:
\[ f[n]=\sum_{i=0}^n(-1)^i\binom{n}{i}g[i] \]
然後分析下為什麼是對的。
考慮任意一種有\(m\)個人站對了的方案,可以發現,在算至少0個到至少\(m-1\)
\[ \begin{align} &~~~~\sum_{i=0}^{m-1}(-1)^i\binom{m}{i}\\ &=\sum_{i=0}^{m}(-1)^i\binom{m}{i}-(-1)^m\\ &=(1+(-1))^m-(-1)^m\\ &=-(-1)^m \end {align} \]
既然多算了這麼多次,就把他減掉,所以是正確的。
對於上面的式子,有一個特例,即:
\[ \sum_{i=0}^{n}(-1)^i\binom{n}{i}=[n=0] \]
即當n不為0時,上面的式子才為0 。
現在考慮下為什麼是這樣的。
首先有一個很顯然的式子:
\[ g[n]=\sum_{i=0}^n\binom{n}{i}f[i] \]
但是我們現在只知道算\(g\),而不會算\(f\)。
先說句廢話:
\[ f[n]=\sum_{i=0}^n[n-i=0]\binom{n}{i}f[i] \]
然後可以發現這個式子中間的部分和上面的式子有點像,帶進去試試。
\[ f[n]=\sum_{i=0}^{n}\sum_{j=0}^{n-i}(-1)^j\binom{n-i}{j}\binom{n}{i}f[i] \]
然後魔術開始:
對於\(\binom{n-i}{j}\binom{n}{i}\),其實就是從\(n\)個裡選出\(i\)
所以原式就會等於
\[ f[n]=\sum_{i=0}^{n}\sum_{j=0}^{n-i}(-1)^j\binom{n-j}{i}\binom{n}{j}f[i] \]
調換下列舉順序
\[ f[n]=\sum_{j=0}^n(-1)^j\binom{n}{j}\sum_{i=0}^{n-j}\binom{n-j}{i}f[i] \]
注意下後面那個玩意,發現這個和\(g\)有點像
\[ \begin{align} f[n]&=\sum_{j=0}^n(-1)^j\binom{n}{j}g[n-j]\\ &=\sum_{j=0}^n(-1)^j\binom{n}{n-j}g[n-j]\\ &=\sum_{i=0}^n(-1)^i\binom{n}{i}g[n] \end{align} \]
這就是一開始的那個式子。
總結
對於一個問題,如果有N個約束條件,求滿足0個條件的方案數,
設\(f[i]\)為恰好有i個約束條件滿足,\(g[i]\)為至少有i個條件被滿足,
顯然有
\[ g[n]=\sum_{i=0}^n\binom{n}{i}f[i] \]
然後可以得到
\[ f[n]=\sum_{i=0}^n(-1)^i\binom{n}{i}g[i] \]
這就是容斥原理,也叫二項式反演。