這是同屆隊爺 2020 年 5 月學的
為什么我怎么菜現在才學嗚嗚嗚嗚。。。
二項式反演學習筆記
眾所周知,奇偶布的容斥很差,是一個板子都不會的傻子。二項式反演是一種廣義容斥,只需要將具有容斥關系的狀態設出套式子就可以解決容斥問題的工具。所以一些容斥很好的 \(\texttt {dalao}\) 是沒有必要學習二項式反演的QAQ。
理論部分:
二項式反演主要有三個式子,最基礎的式子是:
這是二項式反演的基礎式子,而對於反演的證明,諸如此類 \(\sum\) 從 \(0\to n\) 的,我們可以通過證明 \(\sum_{i = j}^n (-1)^{i + j}{n \choose i}{ i \choose j} = e\) 來完成。
注意到這里出現類諸如 \({n \choose i}{i \choose j}\) 的形式,我們有第一個組合恆等式:(當然組合意義更好記憶)
有了這個組合恆等式,我們變化一下式子:
求和那一部分長得像二項式定理,換個元看一看(主要換組合式子里的),令 \(t = n - i\) ,那么求和部分變為:
所以當且僅當 \(n = j\) 時,原式 \(=1\),否則 \(=0\)。所以 \(\texttt {QED}\)。
但是我們可以發現這一個基礎式子不怎么好用,很少有兩種容斥狀態之間的關系存在 \((-1)^{i}\) ,一般都是至多至少與恰好。所以我們對這一個基礎式子變一下形。
我們令 \(h(n) = (-1)^ng(n)\) ,這樣就能將 \((-1)^n\) 去掉,我們就得到了第二個二項式反演的式子:
我們可以觀察到,現在 \(f\) 與 \(h\) 有了明確的容斥關系,此時 \(h(i)\) 表示恰好為 \(i\) 的計數部分,\(f(n)\) 表示至多為 \(n\),並在 \(n\) 中任意選取的總的計數部分。
但做過很多題目的 \(\texttt {dalao}\) 會發現,你這也沒把所有容斥題目包含完啊,還有很多題目 \(f\) 與 \(g\) 的關系是 "至少/欽定" 與 "恰好" 呢,你上面的式子只能計算至多時好計算的呢!所以,有 \(\texttt {dalao}\) 就得到了第三個式子。
這里的 \(m\) 一般是題目給定的上界。
具體的證明可以直接帶入,但過程比較復雜,這里就不放了(。
容易發現,這里 \(f\) 一般是欽定或者是至少選了 \(n\) 項,當這玩意好算的時候我們就會用這個。
理論部分結束QAQ。
有 \(\texttt{dalao}\) 可能會發現,這玩意拋開容斥組合意義不看,和莫比烏斯反演至少在 \(f/g\) 這里有相似之處。一是也有兩種形式供君選擇,二是我們往往會令答案需要求的為 \(g\) ,並且題目的性質出發,去設出恰當好算的 \(f\) ,然后再得到答案。
經典例題:
1. 至多問題:
Problem.對一個排列 \(a_i\) 任意打亂順序,請你求出有多少種排列方式,使得存在 \(a_i \not= i\) 。
Solution: 我們可以發現,我們好判斷的是 \(a_i = i\) ,所以我們可以欽定有多少個 \(a_i = i\),那么剩下的隨便排,所以得到了狀態 \(f\), \(f(n)\) 表示至多存在 \(n\) 個數滿足了錯排的樣子。所以直接使用形式 \(2\) ,我們要求的 \(g(n)\) 是表示恰好有 \(n\) 個數滿足錯排,他們之間的關系滿足形式 \(2\) :\(f(n) = \sum_{i = 0}^n{n\choose i}g(i)\),並且 \(f(n)\) 方便求得,故直接算即可。
2. 至少/欽定問題:
Problem.有一個 \(n\) 個元素的集合,一共有 \(2^n\) 個子集,請你找出若干子集(至少有一個),使得他們的交集有 \(k\) 個元素,求出找子集的方案數。
Solution: 我們先找到 \(k\) 個元素,並且將其欽定為必須選擇的 \(k\) 個,剩下的 \(n - k\) 個元素可選可不選,那么現在找若干集合的方案數好求, \(f(k) = {n \choose k} (2^{2^{n - k}} - 1)\) :表示現在所選集合交集至少有 \(k\) 個元素的方案數。\(g(n)\) 與其滿足形式 \(3\) :\(f(n) = \sum_{i = n}^m{i\choose n} g(i)\) ,故 \(g\) 可以直接算出。
擴展題目:
CF997C Sky Full of Stars:
有一個 \(n \times n\space (1 \le n \le 10^6)\) 的正方形網格,用三種顏色染色,求有多少種染色方案使得至少一行或一列是同一種顏色。
Solution: 如果直接用組合式去表達染色的方案數的話,可以發現是會有重復的。既然存在重復的部分,並且這重復的部分已經能夠用組合式子 表達出來了,所以不難想到使用容斥解決。我們設 \(g(i,j)\) 表示恰好有 \(i\) 行 \(j\) 列是同一種顏色,那么答案就可以被表示為 \(3^{n^2} - g(0,0)\) 。考慮求 出 \(g(0,0)\) ,那么根據剛才發現設 \(f(i,j)\) 表示為至少 \(i\) 行 \(j\) 列是同一種顏色,其滿足 \(f(x,y) = \sum_{i = x}^n\sum_{j = y}^n(-1)^{i+j}{i \choose x}{j \choose y}g(i,j)\) 。所以 \(g\) 可以 通過反演求得,但由於 \(n\) 過大,所以我們要變換一下式子。(以下的式子只是一部分需要推的)
觀察,里面有 \((-1)^i\) ,考慮二項式定理,把 \(i,j\) 的部分分開放。
便可以 \(O(nlogn)\) 計算了。
[AGC035F] Two Histograms
有一個 \(n \times m\space (1 \le n,m \le 5 \times 10^5)\) 的棋盤,對於每一行和每一列選擇當前行和列的一個格子,並將從這個行或列的起始點到這個格子全部 \(+1\),得到的棋盤本質不同的有多少種。
Solution: 隨便操作一下,容易發現很容易就將染出重復顏色棋盤來。重復的原因在於一行一列交在了一起並且不再向下延申,而此時這種染色 情況對應了兩種染色的方案,所以我們規定當且僅當行染到這里才是合法的,明顯地,這樣規定之后不會對答案產生干擾。這樣對重復的東西規 定之后,不難想到使用容斥(二項式反演)來統計方案,我們設 \(f(i)\) 表示規定 \(i\) 個位置不合法,其余隨便填。那么 \(f(i)\) 方便表示出來。
具體意義是,我們先隨便選將要產生不合法的行和列,然后利用 \(i!\) 對行和列進行配對,這樣對於選取的行和列而言,其結果已經固定,再對剩下 的行和列進行選取。有了這一個那么 \(g(i)\) 就會是恰好 \(i\) 個位置不合法,答案將會是 \(g(0)\) 。其滿足 \(f(i) = \sum_{j = i}^n {j \choose i}g(j)\) ,所以 \(g(0)\) 可由反演得 出 \(g(0) = \sum_{i = 0}^n (-1)^i{n \choose 0} f(i)\)。