子集反演
一般有一個很套路的方法。
比如現在有一個全集條件集合 \(U\),現在要求恰好 \(S\) 集合滿足,\(U-S\) 集合不滿足的方案數,設其為 \(f_S\),然而這個並不能直接算出。有一個比較好算的東西是,欽定 \(T\) 集合滿足,不管 \(U-T\) 集合是否滿足的方案數,設其為 \(g_T\)。
顯然有 \(g_S=\sum\limits_{S \subseteq T} f_T\),然后我們可以根據子集反演得到 \(f_S=\sum \limits_{S \subseteq T} g_T(-1)^{|T|-|S|}\),這樣的話就可以算出要求的方案數了。
這個玩意正確的原因是這樣的:可以直接把前一個式子代入后一個式子,會得到
\(f_S=\sum \limits_{S \subseteq T} \sum \limits_{T \subseteq Z}f_Z (-1)^{|T|-|S|}\)
\(=\sum \limits_{S\subseteq Z}f_Z\sum \limits_{S \subseteq T,T \subseteq Z} (-1)^{|T|-|S|}\)
\(=\sum \limits_{S\subseteq Z}f_Z\sum \limits_{T \subseteq Z-S} (-1)^{|T|}\)
\(=\sum \limits_{S\subseteq Z}f_Z[S=Z]=f_S\)
小星星
這題中的限制實際上就是:
- \(n\) 個點均出現在用來編號的排列中。
- 相鄰的編號存在邊。
所以考慮這樣一個做法,首先將排列這個限制去掉,轉化為任意編號。
欽定集合 \(S\) 可以出現在編號序列中,然后做一個簡單的樹形 \(dp\) 來統計這樣的方案數 \(g_S\)。
套用上面的式子,現在求的就是 \(f_U\) ,有 \(ans=\sum \limits_{S} g_S (-1)^{|U|-|S|}\)。
Ribbons on Tree
要求每條邊都能被至少一條路徑覆蓋。
其實只需要欽定若干條邊沒有被覆蓋,這樣就會形成若干個聯通塊。
對於一個節點數為 \(n\) 的聯通塊,不需要保證聯通塊內的邊都被覆蓋,所以任意匹配的方案數就是 \([2|n] (n-1)!!\)。
答案就是對所有欽定的邊集對應的方案數乘上容斥系數求和,這個東西只要記一下這個聯通塊已經放了多少個點,寫一個 \(O(n^2)\) 的樹形 \(\text{dp}\) 就可以解決,解題的思想就是用 \(\text{dp}\) 來優化子集反演中暴力枚舉條件集合的過程。
二項式反演
這個東西就與子集反演比較類似了,一般應用於現在的條件集合與具體哪些沒有關系,而只與集合大小有關。
同樣欽定若干個條件滿足,設為 \(g_i\),將恰好的方案數設為 \(f_i\),有 \(g_i=\sum \limits_{i \leq k}f_k\binom{k}{i}\)。
然后根據二項式反演可以得到 \(f_i=\sum \limits_{i \leq k}g_k\binom{k}{i}(-1)^{k-i}\)。
同樣用代入的方法證明,將前一個式子代入后一個。
\(f_i=\sum \limits_{i \leq k}\sum \limits_{k \leq j}f_j\binom{j}{k}\binom{k}{i}(-1)^{k-i}\)
\(=\sum \limits_{i \leq j}f_j \sum \limits_{i \leq k \leq j}\binom{j}{k}\binom{k}{i}(-1)^{k-i}\)
\(=\sum \limits_{i \leq j}f_j \sum \limits_{i \leq k \leq j}\binom{j}{i}\binom{j-i}{k-i}(-1)^{k-i}\)
\(=\sum \limits_{i \leq j}f_j \binom{j}{i} \sum \limits_{k=0}^{j-i}\binom{j-i}{k}(-1)^k\)
\(=\sum \limits_{i \leq j}f_j \binom{j}{i} (1-1)^{j-i}=f_i\)
集合計數
一個有 \(n\) 個元素的集合有 \(2^n\) 個不同子集(包含空集)。
現在要在這 \(2^n\) 個集合中取出至少一個集合,使得它們的交集的元素個數為 \(k\) ,求取法的方案數。
\(1 \leq n \leq 10^6 ,0 \leq k \leq n\)。
要求的是交集大小恰好為 \(k\) ,設為 \(f_k\),有一個容易算出的東西是欽定交集大小至少為 \(k\),設為 \(g_k\),有 \(g_k=\binom{n}{k} (2^{2^{n-k}}-1)\)。
\(g_k=\sum \limits_{i \geq k} \binom{i}{k}f_i\)
所以可以套用二項式反演的式子得到 \(f_k=\sum \limits_{i \geq k}\binom{i}{k}(-1)^{i-k}g_i\)
七選五
設 \(f_i\) 表示至少 \(i\) 個元素放在對應位置的方案數,\(g_i\) 表示恰好 \(i\) 個元素放在對應位置的方案數,有 \(f_i = \sum \limits_{j=i}^n g_j \binom{j}{i}, f_i = \binom{k}{i} \binom{n-i}{k-i}(k-i)!\)。
反演一下就有 \(g_i = \sum \limits_{j=i}^n f_j \binom{j}{i}(-1)^{j-i}\),這個就是答案了,這道題的 \(n=k,x=0\) 算是經典的錯排問題。
