解決涉及子集配湊的卷積問題
就是解決一類問題:
$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就是係數表式轉換成點值表示的過程。我們熟知的是多項式的係數表示法,通過給定一組 來確定乙個唯一的多項式 而多項式還可以有另一種表...