快速解決:
\[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_ a[p]\sum_b[k]
\\&=a'[i]b'[i]
\end
\]考慮\(a\)和\(a'\)的關係,其中\(a_0,a_1\)分別代表\(a\)的前\(2^\)和後這麼多項(下標都從0開始)。他們的差別是\(2^\)位上的不同。其他相似。
\[fwt(a)=
\begin
fwt(a_0),fwt(a_1+a_0) & k>0
\\a & k=0
\end
\]逗號表示依次連線。
複雜度\(t(n)=2t(n/2)+t(n)=o(n\log n)\),而一般來說\(n=2^m\)那麼就是\(o(m2^m)\)
考慮\(ifwt\)
照貓畫虎即可
\[ifwt(a')=
\begin
ifwt(a'_0),ifwt(a'_1-a'_0) & k>0
\\a' & k=0
\end
\]**
inline void fwt_or(int*a,const int&tag,const int&len)a[j]b[k]
\]可以構造\(c'[i]=fwt(c)[i]=\sum_\limits c[j]\),至於為什麼構造,這個\(j\&k=i\)可以看做\(i\)是\(j,k\)的子集。
同樣有\[fwt(c)=fwt(a)*fwt(b)
\]證明:
\[\begin
&c'[i]&=\sum_ c[j]
\\&= \sum_ \sum_a[k]b[p]
\\&= \sum_a[k]b[p]
\\&= \sum_a[k]\sum_b[p]
\\&=a'[i]b'[i]
\end
\]同樣地
\[fwt(a)=
\begin
fwt(a_0+a_1),fwt(a_1)&k>0
\\a&k=0
\end
\]同樣的\(t(n)=o(m2^m)\)
同樣地\[ifwt(a')=
\begin
ifwt(a'_0-a'_1),ifwt(a_1) &k>0
\\a'&k=0
\end
\]同樣地
inline void fwt_and(int*a,const int&tag,const int&len)a[j]b[k]
\]這裡\(fwt(x)\)貌似沒有很直觀的意義了,推式子的話其實也能理解
\[fwt(c)=fwt(a)*fwt(b)
\]這裡記錄乙個符號\(a\oplus b=c\)
那麼\(c=a\oplus b\)
拆成前後兩半
\[c_0=a_0\oplus b_0+a_1\oplus b_1
\\c_1=a_0\oplus b_1+a_1\oplus b_0\]令
\[x_0=(a_0+a_1)\oplus (b_0+b_1)
\\x_1=(a_0-a_1)\oplus (b_0-b_1)
\]然後?
\[c_0=
\\c_1=
\]但是好像學這個無法和各路大佬進行交流,並且我好像並沒有學會,那麼...
\[fwt(a)=\begin(fwt(a_0)+fwt(a_1),fwt(a_0)-fwt(a_1)) & n>0\\a & n=0\end
\]用迴圈實現的技巧和ntt一致,控制長度,控制第幾段,控制段內的迴圈變數
//@winlere
#include#include#include#includeusing namespace std; typedef long long ll;
inline int qr()
const int maxn=1<<18|1;
const int mod=998244353;
inline void fwt_or(int*a,const int&len,const int&tag)
}int n,k;
int a[maxn],b[maxn],c[maxn];
int a[maxn],b[maxn];
int main()
學習筆記 FWT 快速沃爾什變換
解決涉及子集配湊的卷積問題 就是解決一類問題 f k sum a i b j 基本思想和fft類似。首先轉化成為另乙個多項式 fwt a fwt b 使得 fwt a oplus b fwt a fwt b 這裡,是按位乘。這個是 o n 的。然後,再 ifwt 回去即可。類似於,直接過馬路不好走。...
學習筆記 快速沃爾什變換 FWT
目錄2.按位與卷積 3.按位異或卷積 4.高維前 字尾和與各類卷積的聯絡 5.題目小結 想要快速計算 c k a textb k sum j k a ib j 我們可以利用 mathtt 的思想 將係數多項式轉化成點值多項式,mathcal o n 求得答案後將其還原成係數多項式。假設 a,b 均為...
FFT 快速傅利葉變換 FWT 快速沃爾什變換
實在是 美麗的數學啊 關於傅利葉變換的部落格 講的很細緻 非常易於理解 大概能明白傅利葉變換是幹嗎的了 但是還是不能明白為什麼用傅利葉變換來算多項式求和 在多項式中,dft就是係數表式轉換成點值表示的過程。我們熟知的是多項式的係數表示法,通過給定一組 來確定乙個唯一的多項式 而多項式還可以有另一種表...