總結 快速莫比烏斯變換和子集卷積

2022-02-04 16:50:39 字數 889 閱讀 8075

馬上noip了我在學點啥

求集合並卷積,即\(h_s=\sum_\sum_[l\cup r]f_l*g_r\)

要求更嚴一點,求子集卷積,即\(h_s=\sum_\sum_[l\cup r=s][l\cap r=\varnothing]f_l*g_r=\sum_f_l*g_\)

先看集合並卷積

最暴力的做法就是\(o(2^n)\)分別列舉\(l,r\),\(o(4^n)\)的將答案加到\(h\)裡去 我覺得不行

下面是個高妙做法:

於是問題就在如何快速求出\(f\)和\(g\)莫比烏斯變換。

這東西是個子集和,可以高維字首和優化到\(o(n\times 2^n)\)。

但是我們求出來的只是\(\hat\),我們還需要減去它的子集和,就需要再做一遍高維差分,複雜度同樣是\(o(n\times 2^n)\)。

void fmt(int *a, int o)
下面我們看子集卷積

它的條件比集合並卷積更苛刻,要求\(l\)和\(r\)的集合不能相交。

我們可以在卷積時多加一維,維護集合的大小,如\(f_\)表示集合中有\(i\)個元素,集合表示為\(s\)。顯然,當\(i\)和\(s\)的真實元素個數相等時才是合法的。初始時,我們只把\(f_\)的值賦成原來的\(f_s\),然後做一遍莫比烏斯變換,\(h_=\sum_^if_*g_\)。

還是上**吧

for (int i = 0; i <= n; i++) fmt(g[i], 1);

for (int i = 0; i <= n; i++) fmt(f[i], 1);

for (int i = 1; i <= n; i++)

莫比烏斯變換 子集卷積

大佬 部落格 fwt與運算。其實就是這個的低配版本 用來快速計算子集卷積。就是說,f i g j h k j k i j k 0 f i sum f i g j h k j k i j k 0 打包運算。首先我們考慮它的低配版本。f i g j h k j k i f i sum f i g j h...

科技 快速莫比烏斯變換(反演) 與 子集卷積

我們比較了解的是有關多項式的乘法運算,對於下標為整數,下標運算為相加等於某個數的時候,我們有很優秀的fft做法。但是遇到一些奇怪的卷積形式時,比如我們定義 h f g h sum limits sum limits l cup r s f g 此時下標是乙個集合,運算為集合並的卷積,我們已知了 f ...

莫比烏斯反演總結

看了一天終於把 懵逼武士 入門了,那些大佬們都太強了。學習moblus必須耐心看數學公式和推算證明,如果不能做到這點最好先放一放,提高一下數學思維再來學習。需要明確的是莫比烏斯反演是一種類似 逆 的東西,正著做題不好解,但是逆向思考就很簡單了。對於莫比烏斯反演的學習網上有很多部落格,但是有的講得不是...