BZOJ 2194 快速傅利葉之二

2021-08-22 16:33:14 字數 1531 閱讀 4842

已知 a,

b a,b

序列,計算 ck

=∑ai

×bi−

k ck=

∑ai×

bi−k

。觀察題目名稱,可以想到fft……

fft能解決的是形如下面的式子: hk

=∑fi

×gk−

i hk=

∑fi×

gk−i

可以發現,

f f

陣列的下標和

g' role="presentation" style="position: relative;">g

g陣列的下標和不變,且恒為

k k

。 小小地轉換一下,把

b' role="presentation" style="position: relative;">b

b陣列前後翻轉,得: ck

=∑ai

×bn−

1−(i

−k)=

∑ai×

bn−1

−i+k

c k=

∑ai×

bn−1

−(i−

k)=∑

ai×b

n−1−

i+

k這樣,和不變,恒為 n−

1+k n−1

+k

。然後再構造

f f

序列: ck

=∑ai

×bn−

1−i+

k=fn

−1+k

' role="presentation" style="position: relative;">ck=

∑ai×

bn−1

−i+k

=fn−

1+kc

k=∑a

i×bn

−1−i

+k=f

n−1+

k用fft計算

f f

序列,然後再輸出相應的

c' role="presentation" style="position: relative;">c

c序列就好了。

#include

using

namespace

std;

const

int maxn=2148576;

const

double pi=acos(-1.0);

struct comp

friend comp operator+(const comp &x,const comp &y)

friend comp operator-(const comp &x,const comp &y)

friend comp operator*(const comp &a,const comp &b)

}a[maxn],b[maxn];

int limit=1,r[maxn];

void fft(comp *t,int ty)

bzoj 2194 快速傅利葉之二

time limit 10 sec memory limit 259 mb submit 1314 solved 772 submit status discuss 請計算c k sigma a i b i k 其中 k i n 並且有 n 10 5。a,b中的元素均為小於等於100的非負整數。第一...

bzoj2194 快速傅利葉之二

題目鏈結 給出兩個長度為n的數列a,b。求乙個數列c滿足 c k sum limits na i b i k n le 10 5 長得和卷積很像,觀察一下卷積的形式 c k sum limits ia i b k i 所以先把b陣列翻轉過來。然後所求的式子就變成了 c k sum limits na...

bzoj2194 快速傅利葉之二

請計算 c k sum a i times b i k k leq i n 第一行乙個整數 n 接下來 n 行,第 i 2.i n 1 行,每行兩個數,依次表示 a i b i 0 leq i n 輸出 n 行,每行乙個整數,第 i 行輸出 c i 1 5 3 12 4 1 12 4 1 424 1...