學習筆記 FWT 快速沃爾什變換

2022-02-05 17:03:44 字數 1853 閱讀 1809

解決涉及子集配湊的卷積問題

就是解決一類問題:

$f[k]=\sum_a[i]*b[j]$

基本思想和fft類似。

首先轉化成為另乙個多項式$fwt(a),fwt(b)$

使得:$fwt(a\oplus b)=fwt(a)×fwt(b)$

這裡,$×$是按位乘。這個是$o(n)$的。

然後,再$ifwt$回去即可。

類似於,直接過馬路不好走。先從左邊走上一座天橋,再從天橋走過去,再到馬路右側走下天橋。

就變成了$o(nlogn)$

$fwt$雖然不是非常容易理解,但是比較容易記憶。

(雖然一定要理解)

模擬$fft$的寫法,就可以比較輕鬆記憶。

就是分治壓縮、合併、分治解壓的過程。

【模板】快速沃爾什變換

#pragma gcc optimize(2)

#pragma gcc optimize(3)

#pragma gcc optimize("ofast")#include

#define reg register int

#define il inline

#define numb (ch^'0')

using

namespace

std;

typedef

long

long

ll;il

void rd(int &x)

il void prin(int

x)namespace

miracle}}

}void _and(int *f,int

op) }

}}void _xor(int *f,int

op)

else}}

}}int

main()putchar('\n

');_and(c,

1);_and(d,1

);

for(reg i=0;imod;

_and(e,-1

);

for(reg i=0;ii)putchar('\n

');_xor(c,

1);_xor(d,1

);

for(reg i=0;imod;

_xor(e,-1

);

for(reg i=0;ii)putchar('\n'

);

return0;

}}intmain()

/*author: *miracle*

date: 2018/11/22 15:08:15

*/

模板

多加一維i,強制記錄涉及集合sz大小

外層列舉sz

o(2^n*n^2)

(推薦使用fwt,因為比fmt常數小)

留坑安師大附中集訓 day2

[fwt] uoj #310. 【unr #2】黎明前的巧克力

留坑沒啥可比較的。處理思路一致。

就是運算子的問題吧。

留坑fmt好寫,fwt的與或卷積的第一步可以取代fmt

upda:2019.4.17

fmt可以代替fwt的與或卷積。ifmt把+改成-即可

(xor暫時不知道具體含義,估計也可以代替?)

實際上fmt很辣雞

相比之下,fwt做的事情完全包含fmt,並且常數是fmt的1/2!

[wc2018]州區劃分(這個題我人傻常數大,必須用fwt卡常才能過)

所以還是寫fwt吧

學習筆記 快速沃爾什變換 FWT

目錄2.按位與卷積 3.按位異或卷積 4.高維前 字尾和與各類卷積的聯絡 5.題目小結 想要快速計算 c k a textb k sum j k a ib j 我們可以利用 mathtt 的思想 將係數多項式轉化成點值多項式,mathcal o n 求得答案後將其還原成係數多項式。假設 a,b 均為...

學習筆雞 快速沃爾什變換FWT

快速解決 c i sum a j b k fwt使得我們 fwt c fwt a fwt b 其中 是點積,就是對應位置乘起來。而對於 orfwt c i fwt c i sum c j 那麼證明一下 begin c i sum c j sum sum a p b k sum a p b k sum...

FFT 快速傅利葉變換 FWT 快速沃爾什變換

實在是 美麗的數學啊 關於傅利葉變換的部落格 講的很細緻 非常易於理解 大概能明白傅利葉變換是幹嗎的了 但是還是不能明白為什麼用傅利葉變換來算多項式求和 在多項式中,dft就是係數表式轉換成點值表示的過程。我們熟知的是多項式的係數表示法,通過給定一組 來確定乙個唯一的多項式 而多項式還可以有另一種表...