BZOJ2194 快速傅利葉之二 FFT

2022-05-20 07:03:03 字數 1647 閱讀 1796

time limit: 10 sec  memory limit: 259 mb

[submit][status][discuss]

請計算c[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n。 a,b中的元素均為小於等於100的非負整數。

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

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

53 1

2 41 1

2 41 4

2412106

1n < = 10 ^ 5

顯然是運用fft,看到題目裡b下標i-k,於是乎我們就要想乙個辦法,把它弄成卷積的形式。

然後翻轉一下,下標就變成了(n-1)-(i-k)。那ans[n-1+k]=σa[i]*b[(n-1)-(i-k)]啦。

至於卷積這個東西,當然是讓我們膜拜aireenye

啦!(←_←戳名字有驚喜)

1 #include2 #include    

3 #include4 #include5 #include6 #include7 #include8 #include9

using

namespace

std;

10 typedef long

long

s64;

1112

const

int one = 5e5+5;13

const

double pi = acos(-1.0

);14

15int

n, m;

16int

tn, tl;

17int

bitrev[one];

1819

struct

complex

2023 complex(double _r, double

_i)24

: r(_r), i(_i) {}

25 friend complex operator +(complex a, complex b)

2629 friend complex operator -(complex a, complex b)

3033 friend complex operator *(complex a, complex b)

3437

}a[one], b[one];

3839

intget

()40

4950

51void fft_init(int

n)5262}

6364

void fft(complex *a, int

rev)

6571

72for(int k = 1; k < tn; k <<= 1)73

85}86}

87}8889

intmain()

90106

view code

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