BZOJ2194 快速傅利葉之二 fft

2022-02-27 19:20:44 字數 1198 閱讀 4281

請計算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]。

3 12 4

1 12 4

1 4和2179幾乎一模一樣

由於卷積的定義要求下標之和為常數,我們嘗試將原式變形,發現只要將a或者b反過來存就可以了

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

#define ll long long int

#define rep(i,n) for (int i = 1; i <= (n); i++)

#define redge(u) for (int k = h[u],to; k; k = ed[k].nxt)

#define bug(s,n) for (int i = 1; i <= (n); i++) cout<57)

while (c >= 48 && c <= 57)

return out * flag;

}typedef complexe;

e a[maxn],b[maxn];

int n,m,l,r[maxn];

void fft(e* a,int f)

} }if (f == -1) for (int i = 0; i < n; i++) a[i] /= n;

}int main()

m = n << 1; for (n = 1; n <= m; n <<= 1) l++;

for (int i = 0; i < n; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));

fft(a,1); fft(b,1);

for (int i = 0; i <= n; i++) a[i] *= b[i];

fft(a,-1);

for (int i = (m >> 1); i >= 0; i--) printf("%d\n",(int)(a[i].real() + 0.1));

return 0;

}

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

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