基本操作
集合並卷積
集合冪卷積定義為:給定兩個集合冪級數 \(F,G\),計算集合冪級數 \(H\) 滿足:
\[\begin{aligned} h_S=\sum_{L\subset 2^U}\sum_{R\subset 2^U}[L\cup R=S]f_Lg_R \end{aligned} \]
我們考慮用類似於 FFT 的方式,把 \(f,g\) 按某種線性變換後,然後把問題變成點乘。
由於位運算按位獨立,我們可以把 \(F,G\) 拆成:
所以我們得到:
這樣我們就把問題用 \(O(2^n)\) 的代價變成了兩個 \(2^{n-1}\) 項的集合冪級數的並卷積,時間複雜度為 \(T(n)=2T(n-1)+O(2^n)=O(n2^n)\)。
由於這個我們涉及到遞迴和陣列複製,導致常數不理想,我們可以考慮像 FFT 一樣,將這個過程變成非遞迴的。
我們發現,每一次我們就是將 \(2^{n-1}\le i<2^n\) 的 \(f_i\) 加上 \(f_{i-2^{n-1}}\) 即可。
然後我們從小到大列舉 \(i\),然後進行加操作即可。
這一部分被我們稱為 FMT,我們設 FMT 之後的陣列為 \({\hat f}_S,{\hat g}_S,\hat h_S\)。
我們考慮怎麼變回去,手玩之後知道一個 \(T\subset S\),\(\hat h_T\) 對於 \(h_S\) 的容斥係數是 \((-1)^{|S|-|T|}\),這個你隨便證一下就好了。
我們發現,這是一個線性變換,所以我們是可以構造矩陣描述這個過程的,真是好澀,具體可以看 cmd 先生的部落格
雖然矩陣很好理解,但是由於沒有學過另一種描述導致你可能會在 ZJOI2019 開關裡面看不懂 solution,所以可能還是要學會一下這個神秘的東西。
然後交卷積和並本質相同。
集合對稱差卷積
集合冪卷積定義為:給定兩個集合冪級數 \(F,G\),計算集合冪級數 \(H\) 滿足:
\[\begin{aligned} h_S=\sum_{L\subset 2^U}\sum_{R\subset 2^U}[L\oplus R=S]f_Lg_R \end{aligned} \]
我們還是考慮把 \(x^{\{n\}}\) 提出來分治,則我們知道:
如果直接算,你發現還是 \(O(4^n)\) 的,我們考慮構造 \(A=(F^-+F^+)(G^-+G^+),B=(F^--F^+)(G^--G^+)\),則
時間複雜度 \(O(n2^n)\)。
沃爾什變換
還是考慮集合對稱差卷積,我們進行一步轉化:
證明:
- \(S=\varnothing\),顯然成立
- 否則我們任意從 \(S\) 選出一個 \(x\),包含 \(x\) 和不包含 \(x\) 的 \(T\) 一一對應且和正好為 \(0\),證畢。
注意到 \(L\oplus R=S\) 等價於 \(L\oplus R\oplus S=0\),且 \((L\oplus R)\cap S=(L\cap S)\oplus (R\cap S)\),所以;
所以我們令 \(\hat f_S=\sum_{T}f_T(-1)^{|S\cap T|}\) 即可,它被成為 \(f\) 的 沃爾什變換,也記作 \(\text{FWT}(f)\)。
同理,我們定義 \(\hat f_S\) 的 沃爾什逆變換 為 \(f_S=\frac1 {2^n}\sum_T\hat f_T(-1)^{|S\cap T|}\),也記作 \(\text{IFWT}(\hat f)\)。
考慮證明這兩個互逆:
然後我們考慮怎麼計算 沃爾什(逆)變換。
設我們列舉到了 \(j\) 位,對於 \(p=i\) 和 \(q=i+2^{j-1}\),我們發現沃爾什變換就是讓 \(f'(p)=f(p)+f(q),f'(q)=f(p)-f(q)\),而逆變換則在最後乘上 \(\frac 1 {2^n}\) 即可。
子集卷積
定義集合之間的卷積為不交集合並,即
暴力可以做到 \(O(3^n)\) 但是不夠優秀。
我們發現,當 \(L\cup R=S\) 時,\(L\cap R=\varnothing\) 的充要條件是 \(|L|+|R|=|S|\),所以我們轉二元 GF,然後把 \(F_{|L|,L}\) 和 \(G_{|R|,R}\) 貢獻到 \(H_{|L|+|R|,L\cup R}\),那麼 \(h_S=H_{|S|,S}\),然後你可以對於 \(F_{1\sim n},G_{1\sim n}\) 做 \(\text{FWT}\),然後暴力卷積一下,最後對 \(H_{1\sim n}\) \(\text{IFWT}\) 回來即可,時間複雜度 \(O(n^22^n)\)。
集合冪級數求逆
我們先對行 FWT,然後列多項式求逆,然後列 IFWT 回來即可。
集合冪級數 exp
我們先對行 FWT,然後列 exp,然後列 IFWT 回來即可,對列 exp 可以使用 \(O(n^2)\) 多項式。
然後組合意義和形式冪級數的相似: 選取若干個不相交的集合組合成S的方案數。
集合冪級數 ln
我們先對行 FWT,然後列 ln,然後列 IFWT 回來即可,對列 ln 可以使用 \(O(n^2)\)
然後由 exp 的組合意義可以得到 ln 的組合意義: 將S拆分成若干個不相交集合的方案數
習題
[ABC212H] Nim Counting
根據 Nim 遊戲,我們知道先手必勝是 xor 和不為 \(0\)。
則我們設 \(f(x)=\sum x^{A_i}\),所以我們需要知道:
由於 FWT 是線性變換,所以我們可以 FWT 之後做等比數列求和然後 IFWT 回來即可。
[WC2018] 州區劃分
我們可以先簡單的判斷一個州是否是合法的,你直接判是否存在尤拉回路即可。
然後考慮集合冪級數,每次列舉最後加入的州的集合,然後類子集卷積地半線上卷積一下,就是按集合大小從小往大做就行了。
[NOI Online #3 提高組] 優秀子序列
我們令每個元素對應的生成函式是 \(x^\varnothing+x^{a_i}\),然後我們就要把所有的乘起來。
我們考慮付公主的揹包,我們使用 ln+exp 來做。
我們推一下式子:
由於我們的乘積定義為子集卷積,所以上述式子只在 \(k=1\) 時有值,所以我們得到:
然後變成了 exp 板子,需要特判 \(a_i=\varnothing\)。
[CEOI2019] Amusement Park
我們考慮對於一個有向無環圖,我們可以將邊全部翻轉仍然滿足條件,互反的一組邊反轉次數為 \(m\),所以我們只需要計算方案數乘上 \(\frac m 2\) 即可。
然後我們考慮設 \(S\) 點集無環的方案數,我們考慮拆 DAG,欽定入度為 \(0\) 的點集 \(t\),則 \(t\) 為獨立集,方案數是 \(F_{S-t}\),由於我們是欽定,所以還需要容斥,可以得到:
然後我們設這個係數的生成函式為 \(G\),則 \(F=FG+1,F=\frac 1 {1-G}\) 集合冪級數求逆即可。
LOJ 154. 集合劃分計數
我們發現,就是子集卷積的 \(\exp\) ,只不過最多隻能有 \(k\) 項。
我們考慮寫出答案的生成函式 \(G\),得到:
所以我們只需要計算出 \(F^k\) 然後就可以提取兩端係數遞推即可,問題轉化成集合冪級數快速冪,對一維 FWT 對另外一維 \(O(n^2)\) 計算多項式快速冪即可。
[ZJOI2019] 開關
我們考慮用集合冪級數 \(\sum_Sf_Sx^S\) 表示從 \(0\) 到 \(S\) 狀態的期望時間,\(G\) 是轉移係數,且我們知道 \(\sum_{T}g_T=1\),則我們可以知道:
後面那個 \(c\) 是由於狀態轉移對於 \(x^\varnothing\) 不成立而加的特判。
現在我們需要求 \([x^U]F(x)\),我們先考慮對原式子做 FWT,則我們知道:
當 \(U=\varnothing\) 時,\([x^U]\hat G=1\),所以 \(c=-2^n\)。
對於其他的 \(U\),\([x^U]\hat G<1\),可以得到 \([x^U]\hat F=\frac c{1-[x^U]\hat G}\)。
然後做 \(\text{IFWT}\),得到:
然後由於
所以我們知道:
dp 即可,時間複雜度 \(O(n\sum p)\)。
[AGC034F] RNG and XOR
跟上一個題差不多,快進到
然後我們發現,對於這個 \([x^\varnothing ]\hat F\) 好像不是很好算的樣子,難繃。
我們發現
然後 \([x^\varnothing]F=0\),所以我們就可以知道 \([x^\varnothing ]\hat F=\sum_{T\not=\varnothing}[x^T]\hat F\),然後就能計算出來了,最後 IFWT 即可。
時間複雜度 \(O(n2^n)\)。
可能還有一些習題,但是鴿了