FWT 學習筆記

2021-10-08 08:41:48 字數 3317 閱讀 3015

因為考試遇見了所以來學習一下,雖然好像之前有個神仙來講過,但啥都記不到了

相比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=

i​aj

​這樣的話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,否則...