FMT快速莫比烏斯變換

請大家注意:

因為作者寫的文章中的梯等式公式總是莫名的顯示錯誤,所以作者的許多文章中的梯等式都暴力拆成一步一個等式了。
造成的不適,請諒解。
同時,如果文章中還有其他錯誤,請聯(lián)系作者,謝謝。

問題模型

快速求f(S) = \sum_{A \cup B = S} g(A)h(B)。

公式推導(dǎo)

原式等價與:
f(S) = \sum_{A \subseteq S} \sum_{B \subseteq S} [A \cup B =S]g(A)h(B)
f(S) = \sum_{A \subseteq S} g(A) \sum_{B \subseteq S} h(B)[A \cup B = S]
那么我們設(shè):
\begin{align} \hat f(S) &= \sum_{T \subseteq S} f(T) \\ \hat g(S) &= \sum_{T \subseteq S} g(T) \\ \hat h(S) &= \sum_{T \subseteq S} h(T) \end{align}
就有:
\hat f(S) = \hat g(S) \times \hat h(S)
之后可以用之前的子集反演得到:
f(S) = \sum_{T \subseteq S} (-1)^{|S-T|} \hat f(T)
現(xiàn)在問題就是如何快速的在\hat ff之間變換。
由于3^n的枚舉子集過于簡單,就不講了,在這里介紹O(n2^n)的做法:
我們先考慮正變換,考慮遞推:
設(shè)\hat f_{i}(S)表示\sum_{T \subseteq S} [(S-T) \subseteq \{0,1,2,...,i\}] f(T)
那么我們有:\hat f_{0}(S) = f(S)
然后對于所有不包含i+1這個元素的集合S,有:
\hat f_{i+1}(S) = \hat f_{i}(S)
\hat f_{i+1}(S \cup \{i+1\}) = \hat f_{i}(S \cup \{i+1\}) + \hat f_{i}(S)
那么\hat f_n即為所求。
接下來我們考慮反演,求出答案:
我們類似的定義f_{i}(S),那么對于所有不包含i這個元素的集合S,有:
f_{i-1}(S) = f_{i}(S)
f_{i-1}(S \cup \{i\}) = f_{i}(S \cup \{i\}) - f_{i}(S)
最后f_0即為所求。
又因為每一位(每一個元素)是獨立的,所以我們可以從0 \sim n而不是從n \sim 0。
那么我們就做完了。

拓展_1:集合交卷積

這個也是可以做集合交卷積的。
因為A \cap B = All - (All-A) \cup (All-B)
所以我們在進(jìn)行變換之前先將每個值和它的補(bǔ)集交換一下,
在變換之后在交換一次,就好了。

拓展_2:子集卷積

其實就是在并集的基礎(chǔ)上有加了一個條件:A \cap B = \Phi。
這樣我們只需要再加一維表示集合的大小,就好了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容