bzoj 2194 快速傅利葉之二

2021-07-31 20:58:47 字數 1226 閱讀 1248

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的非負整數。

第一行乙個整數n,接下來n行,第i+2..i+n-1行,每行兩個數,依次表示a[i],b[i] (0 < = i < n)。

輸出n行,每行乙個整數,第i行輸出c[i-1]。 5

3 12 4

1 12 4

1 424

121061

【分析】

乍一看不是卷積...那我們機智(zz)的轉換一下問題。原來

c[0]=a[0]b[0]+a[1]b[1]+...+a[n-1]b[n-1]

c[1]=a[1]b[0]+a[2]b[1]+...+a[n-1]b[n-2]

......

把b陣列整體翻轉一下

c[0]=a[0]b[n-1]+a[1]b[n-2]+...+a[n-1]b[0]

c[1]=a[1]b[n-1]+a[2]b[n-2]+...+a[n-1]b[1]

所以  c[k]=sigama,也就是a陣列下標+b陣列下標==k+n-1的所有a,b項的乘積...

所以這就是乙隻捲雞。

黑箱fft!

【**】

#include#include#include#include#define pi acos(-1)

#define ll long long

#define fo(i,j,k) for(i=j;i<=k;i++)

using namespace std;

typedef complex e;

const int mxn=500005;

int n,m,l;

int r[mxn],c[mxn];

e a[mxn],b[mxn];

inline int read()

while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();

return x*f;

}inline void fft(e *a,int f)

BZOJ 2194 快速傅利葉之二

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

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