集合冪級數學習筆記

Nityacke發表於2024-05-05

基本操作

集合並卷積

集合冪卷積定義為:給定兩個集合冪級數 \(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\) 拆成:

\[F=F^-+x^{\{n\}}F^+,G=G^-+x^{\{n\}}G^+ \]

所以我們得到:

\[H=F^-\cdot G^-+x^{\{n\}}((F^-+F^+)\cdot (G^-+G^+)-F^-\cdot 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\}}\) 提出來分治,則我們知道:

\[FG=(F^-\cdot G^-+F^+\cdot G^+)+x^{\{n\}}(F^-\cdot G^++F^+\cdot G^-) \]

如果直接算,你發現還是 \(O(4^n)\) 的,我們考慮構造 \(A=(F^-+F^+)(G^-+G^+),B=(F^--F^+)(G^--G^+)\),則

\[H=\frac {p+q}2+x^{\{n\}}\frac {p-q}2 \]

時間複雜度 \(O(n2^n)\)

沃爾什變換

還是考慮集合對稱差卷積,我們進行一步轉化:

\[[S=\varnothing]=\frac 1 {2^n}\sum_{T}(-1)^{|S\cap T|} \]

證明:

  • \(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)\),所以;

\[\begin{aligned} h_S&=\sum_{L\subset 2^U}\sum_{R\subset 2^U}[L\oplus R=S]f_Lg_R\\ &=\frac1 {2^n}\sum_{T\subset 2^n}\sum_{L\subset 2^U}\sum_{R\subset 2^U}(-1)^{|(L\oplus R\oplus S)\cap T|}f_Lg_R\\ &=\frac1 {2^n}\sum_{T\subset 2^n}(-1)^{|S\cap T|}(\sum_{L\subset 2^U}(-1)^{|L\cap T|}f_L)(\sum_{R\subset 2^U}(-1)^{|R\cap T|}g_R)\\ \end{aligned} \]

所以我們令 \(\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)\)

考慮證明這兩個互逆:

\[\begin{aligned} f_S&=\frac 1 {2^n}\sum_T\hat f_T(-1)^{|S\cap T|}\\ &=\frac1 {2^n}\sum_T\sum_Xf_X(-1)^{|(S \oplus X)\cap T|}\\ &=\sum_X f_X\frac 1 {2^n}\sum_T(-1)^{|(S \oplus X)\cap T|}\\ &=\sum_Xf_X[S\oplus X=0]=f_S \end{aligned} \]

然後我們考慮怎麼計算 沃爾什(逆)變換。

設我們列舉到了 \(j\) 位,對於 \(p=i\)\(q=i+2^{j-1}\),我們發現沃爾什變換就是讓 \(f'(p)=f(p)+f(q),f'(q)=f(p)-f(q)\),而逆變換則在最後乘上 \(\frac 1 {2^n}\) 即可。

子集卷積

定義集合之間的卷積為不交集合並,即

\[h_S=\sum_L\sum_R[L\cup R=S][L\cap R =\varnothing]f_Lg_R \]

暴力可以做到 \(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}\),所以我們需要知道:

\[\sum_{w>0}[x^w]\sum_{i=1}^Nf^i(x) \]

由於 FWT 是線性變換,所以我們可以 FWT 之後做等比數列求和然後 IFWT 回來即可。

[WC2018] 州區劃分

我們可以先簡單的判斷一個州是否是合法的,你直接判是否存在尤拉回路即可。

然後考慮集合冪級數,每次列舉最後加入的州的集合,然後類子集卷積地半線上卷積一下,就是按集合大小從小往大做就行了。

[NOI Online #3 提高組] 優秀子序列

我們令每個元素對應的生成函式是 \(x^\varnothing+x^{a_i}\),然後我們就要把所有的乘起來。

我們考慮付公主的揹包,我們使用 ln+exp 來做。

我們推一下式子:

\[\begin{aligned} P(x)&=\prod_{i=1}^n(x^\varnothing +x^{a_i})\\ &=\exp\sum_{i=1}^n\ln(x^\varnothing+x^{a_i})\\ &=\exp \sum_{i=1}^n\sum_{k=1}\frac {(-1)^{k+1}(x^{a_i})^k}{k} \end{aligned} \]

由於我們的乘積定義為子集卷積,所以上述式子只在 \(k=1\) 時有值,所以我們得到:

\[P(x)=\exp\sum_{i=1}^nx^{a_i} \]

然後變成了 exp 板子,需要特判 \(a_i=\varnothing\)

[CEOI2019] Amusement Park

我們考慮對於一個有向無環圖,我們可以將邊全部翻轉仍然滿足條件,互反的一組邊反轉次數為 \(m\),所以我們只需要計算方案數乘上 \(\frac m 2\) 即可。

然後我們考慮設 \(S\) 點集無環的方案數,我們考慮拆 DAG,欽定入度為 \(0\) 的點集 \(t\),則 \(t\) 為獨立集,方案數是 \(F_{S-t}\),由於我們是欽定,所以還需要容斥,可以得到:

\[F_S=\sum_{T\subset S}(-1)^{|T|-1}[t 為獨立集]F_{S-T} \]

然後我們設這個係數的生成函式為 \(G\),則 \(F=FG+1,F=\frac 1 {1-G}\) 集合冪級數求逆即可。

LOJ 154. 集合劃分計數

我們發現,就是子集卷積的 \(\exp\) ,只不過最多隻能有 \(k\) 項。

我們考慮寫出答案的生成函式 \(G\),得到:

\[\begin{aligned} G&=\sum_{n=0}^k\frac {F^n}{n!}\\ G'&=F'(G-\frac {F^k}{k!}) \end{aligned} \]

所以我們只需要計算出 \(F^k\) 然後就可以提取兩端係數遞推即可,問題轉化成集合冪級數快速冪,對一維 FWT 對另外一維 \(O(n^2)\) 計算多項式快速冪即可。

[ZJOI2019] 開關

我們考慮用集合冪級數 \(\sum_Sf_Sx^S\) 表示從 \(0\)\(S\) 狀態的期望時間,\(G\) 是轉移係數,且我們知道 \(\sum_{T}g_T=1\),則我們可以知道:

\[F=\sum_Tx^T+F\times G+c\times x^\varnothing \]

後面那個 \(c\) 是由於狀態轉移對於 \(x^\varnothing\) 不成立而加的特判。

現在我們需要求 \([x^U]F(x)\),我們先考慮對原式子做 FWT,則我們知道:

\[\begin{aligned} \\ [x^U]{\hat F}&=[x^U]{\hat F}[x^U]{\hat G}+\sum_T(-1)^{|T\cap U|}+c\\ [x^U]\hat F(1-[x^U]\hat G(x))&=\sum_T(-1)^{|T\cap U|}+c\\ \end{aligned} \]

\(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}\),得到:

\[\begin{aligned} f_S&=\frac 1 {2^n}\sum_T(-1)^{|S\cap T|}[x^T]\hat F\\ &=\frac 1 {2^n}([x^\varnothing]\hat F-2^n\sum_{T\not=\varnothing}(-1)^{|S\cap T|}\frac 1 {1-[x^T]\hat G})\\ \end{aligned} \]

然後由於

\[\begin{aligned} \frac1 {2^n}\sum_T\hat f_T&=f_\varnothing,f_\varnothing=0\\ \hat f_0&=-\sum_{T\not=\varnothing }\hat f_T\\ \hat f_0&=2^n\sum_{T\not= \varnothing}\frac {1}{1-[x^T]\hat G} \end{aligned} \]

所以我們知道:

\[\begin{aligned} f_S&=\sum_{T\not=\varnothing}\frac 1 {1-[x^T]\hat G}-\sum_{T\not=\varnothing}(-1)^{|S\cap T|}\frac 1 {1-[x^T]\hat G}\\ &=\sum_{T\not=\varnothing}2\times [|S\cap T|\equiv 1\bmod 2]\frac 1 {1-[x^T]\hat G}\\ &=\sum_{T\not=\varnothing}2\times [|S\cap T|\equiv 1\bmod 2]\frac 1 {1-(1-2\sum_{i\in T}p_i)}\\ &=\sum_{T\not=\varnothing}[|S\cap T|\equiv 1\bmod 2]\frac1 {\sum_{i\in T}p_i} \end{aligned} \]

dp 即可,時間複雜度 \(O(n\sum p)\)

[AGC034F] RNG and XOR

跟上一個題差不多,快進到

\[\forall U\not=\varnothing,[x^U]\hat F=\frac {-2^n}{1-[x^U]\hat G} \]

然後我們發現,對於這個 \([x^\varnothing ]\hat F\) 好像不是很好算的樣子,難繃。

我們發現

\[\frac 1 {2^n}\sum_T[x^T]\hat F=[x^\varnothing]F \]

然後 \([x^\varnothing]F=0\),所以我們就可以知道 \([x^\varnothing ]\hat F=\sum_{T\not=\varnothing}[x^T]\hat F\),然後就能計算出來了,最後 IFWT 即可。

時間複雜度 \(O(n2^n)\)

可能還有一些習題,但是鴿了

相關文章