基本操作 快速沃爾什變換

2022-05-22 20:15:12 字數 2369 閱讀 8227

還是補全一下科技樹吧...之後可能就專心刷刷題?

雖然感覺我的科技樹連開始的一層都沒點全。。。

fwt 可以用來解決多項式的位運算卷積,也就是對於兩個多項式 $a,b$ ,求乙個 $c$ 滿足 $c_k = \sum\limits_^n\sum\limits_^n[i\oplus j == k]a_i \times b_j$

常見的有 $and,or,xor$ 卷積

式子就不推了,放個結論吧

令 $a$ 為乙個 $2^n$ 維向量

設 $a_0$ 為 $a$ 的前 $2^$ 維組成的向量, $a_1$ 為 $a$ 的後 $2^$ 維組成的向量

則對於 or 卷積:

$$fwt(a)=

\begin

(fwt(a_0),fwt(a_0) + fwt(a_1))& \text\\

a& \text

\end$$

順便,or 的 fwt 相當於對於每個非空集合求了子集和

對於 and 卷積:

$$fwt(a)=

\begin

(fwt(a_0) + fwt(a_1),fwt(a_1))& \text\\

a& \text

\end$$

對於 xor 卷積:

$$fwt(a)=

\begin

(fwt(a_0) + fwt(a_1),fwt(a_0) - fwt(a_1))& \text\\

a& \text

\end$$

#include#define ll long long

using

namespace

std;

namespace

io return (hd==tl)?eof:*hd++;}

void flush()

void putchar(char c)

void write(int

x) if(x<0) x=-x,putchar('-'

);

while(x) ss[++top]=x%10,x/=10

;

while(top) putchar(ss[top]+'

0'),--top;

}intread()

}using

namespace

io;const

int maxn = 200010,mod = 998244353,inv2 = 499122177

;int

n,m,a[maxn],b[maxn];

inline

int inc(int x,int y)

inline

int dec(int x,int y)

inline

int skr(int x,int

t)return

res;

}inline

void fwt(int *a,int n,int t,int f)//

1:or , 2:and , 3:xor

else

if(t == 2

)

else

if(t==3

) }}

}}int

main()

view code

wc2018 州區劃分

有乙個無向圖,你要把它劃分成 k 個州,要求每個州內不能存在尤拉迴路,每個州的滿意度是 $i$ 州的權值和除以前 $i$ 州的權值和 ,乙個劃分方案的滿意度是所有州滿意度的乘積,求所有劃分方案滿意度之和,膜 998244353

$n \leq 21$

sol:

記 $sig_s=\sum\limits_w_i \times [州內沒有尤拉迴路]$

顯然是乙個子集 dp:

$f_ = \frac\sum\limits_f_ \times sig_$

然後發現這是乙個子集卷積,一般是列舉一下集合大小,然後直接卷

haoi2015 按位或

一開始你有乙個數字 $0$ ,每秒你有 $p_i$ 的概率得到乙個$\in [0,2^n-1]$數字 $i$,與你現在的數字進行按位或,求期望多少秒能得到 $2^n-1$

$n \leq 20$

sol:

先最值反演

然後就是對於每個子集 $t$ 要求 $e(min\)$

發現只要有一位異或上了就可以了,那就是 $e(min\) = \fracp_s}$

現在就是對於每個 $t$ 要求所有與 $t$ 有交的集合權值和

發現有交的不好求,沒交的就是 $t$ 所有補集的子集,用 fwt 預處理子集和就行了

(其實不 fwt 也行,但這畢竟是一篇 fwt 部落格

快速沃爾什變換

用於解決集合邏輯運算的演算法。就是能夠造出類似多項式卷積的形式 可以是 證明解釋什麼的。找了大半天了,也沒找到個自己能看懂的,好吧,背模板 題面 給出n個小於2 20的數,指定 其中之一為操作opt,求給定的n個數中任選兩個,經過opt操作後能得到的最大值是多少?solution 記fi 數字i出現...

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

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

快速沃爾什變換 學習筆記

用來解決一類與位運算有關卷積問題 c i sum a j b k 2 基礎思想和fft類似,我們正變換求出乙個類似點值表示的東西,然後用它直接乘,然後逆變換。fft我們對下標奇偶分治。這裡求變換我們按位分治。與和或根據位運算的性質很好想,可以自己推一推異或記住就行了 二進位制運算的性質很強啊,重點在...