因為考試遇見了所以來學習一下,雖然好像之前有個神仙來講過,但啥都記不到了
相比fft的ci=
∑j+k
=iaj
∗b
kc_i=\sum_a_j*b_k
ci=j+
k=i∑
aj
∗bk
fwt其實很簡單
c i=
∑j⨁k
=iaj
∗b
kc_i=\sum_a_j*b_k
ci=j⨁
k=i∑
aj
∗bk
其中⨁
⊂\bigoplus \subset
⨁⊂三種位運算
首先需要類似的,把多項式補為2
x2^x
2x項,然後就可以根據位運算不同位互不影響來做啦( * ^ ▽ ^ *)
大體思路也是將多項式fwt(a)變換後,fwt(a)*fwt(b)=fwt(ans),最後ifwt(ans)變回來
複雜度o(nlogn)
f wt
(a)i
=∑j∣
i=ia
jfwt(a)_i=\sum_a_j
fwt(a)
i=j
∣i=i
∑aj
將下標二進位制來看,考慮目前最高一位為0或為1(也就是將多項式拆成兩部分來分析),那些有貢獻
①最高位為0,0∣0
=0
0|0=0
0∣0=
0②最高位為1,0∣1
=1;1
∣1=1
0|1=1 ;1|1=1
0∣1=1;
1∣1=
1得出f wt
(a)=
&merge(fwt(a_0),fwt(a_0)+fwt(a_1)) (n\neq 1)\\&a_i (n=1)\end\right.
fwt(a)
=&merge(ifwt(a_0),ifwt(a_0)-ifwt(a_1)) (n\neq 1)\\&a_i (n=1)\end\right.
ifwt(a
)=a_j
fwt(a)
i=j
&i=i
∑aj
同理①最高位為0,0&0
=0;1
&0=0
0\and0=0;1\and0=0
0&0=0;
1&0=
0②最高位為1,1&1
=1
1\and1=1
1&1=1得出
f wt
(a)=
&merge(fwt(a_0)+fwt(a_1),fwt(a_1)) (n\neq 1)\\&a(n=1)\end\right.
fwt(a)
=&merge(ifwt(a_0)-ifwt(a_1),ifwt(a_1)) (n\neq 1)\\&a (n=1)\end\right.
ifwt(a
)=a_j
fwt(a)
i=∑
j⋀i=
iaj
這樣的話0⋀0
=0,0
⋀1=1
0 \bigwedge0=0,0\bigwedge1=1
0⋀0=0,
0⋀1=
1,你會發現你得到了fwt
(a)=
&merge(fwt(a_0),fwt(a_0)) (n\neq 1)\\&a(n=1)\end\right.
fwt(a)
=a_i
fwt(a)
i=∑
(−1)
num1
(i&0
)ai
這裡還是去看其他巨佬的吧
f wt
(a)=
&merge(fwt(a_0)+fwt(a_1),fwt(a_0)-fwt(a_1)) (n\neq 1)\\&a(n=1)\end\right.
fwt(a)
=&merge(\frac2,\frac2\\&a (n=1)\end\right.
ifwt(a
)=⎩⎨
⎧m
erge
(2if
wt(a
0)−
ifwt
(a1
),2
ifwt
(a0
)−if
wt(a
1))
(n
=1)
a(n=
1)
#include
#define int long long
#define ll long long
using
namespace std;
const
int mod=
998244353
;const
int n=
1<<17;
ll quick_mul
(ll a,
int k)
return ans;
}ll inv
(ll a)
ll inv2;
int lim,len;
void
get_or
(int
*a,int flag)
void
get_and
(int
*a,int flag)
void
get_xor
(int
*a,int flag)
if(flag==1)
return
; ll inv_=
inv(lim)
;for
(int i=
0;i)a[i]
=a[i]
*inv_%mod;
}void
poly_or
(int
*a,int
*b,int
*ans)
void
poly_and
(int
*a,int
*b,int
*ans)
void
poly_xor
(int
*a,int
*b,int
*ans)
voidpr(
int*a)
int a[n]
,b[n]
,c[n]
;signed
main()
FWT 學習筆記
好久以前寫的,先粘上來 定義陣列 n 2 k a a 0,a 1,a 2,a 3,a 令 a 0 a 0,a 1,a 2,a 且 a 1 a a a 即 a 0 為沒有最高位的部分,a 1 為有二進位制最高位的部分 a 可以用 a 表示 定義運算 a b a 0 b 0,a 1 b 1,a n b ...
FWT背板筆記
板子 背板子.jpg fwt 用於解決這樣的問題 c i sum a j times b k 其中 bigoplus 是一種二元運算子,如 or,and,xor 首先我們直接做複雜度顯然高達 4 n 或許可以利用一些列舉子集的技術做到 3 n 但是還是非常難以接受 於是我們考慮能否像 fft 那樣構...
FWT 學習總結
我理解的fwt是在二元運算意義下的卷積 目前比較熟練掌握的集合對稱差卷積 對於子集卷積和集合並卷積掌握不是很熟練 挖坑ing 那麼就先來談一談集合對稱差卷積吧 所謂集合對稱差卷積 就是h i sigma g j f k j k i 首先乙個很顯然的事情是如下結論 證明就是如果s是空集,答案為1,否則...