已知 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...