BZOJ 2194 快速傅利葉之二 FFT

2021-07-05 01:28:43 字數 1785 閱讀 2861

2194: 快速傅利葉之二

time limit: 10 sec memory limit: 259 mb

description

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

input

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

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

sample input

3 12 4

1 12 4

1 4sample output

hint

source把b

i 倒過來

原式變為ck

=∑ia

ibn+

k−1−

i=∑i

aibn

′−i

然後fft

#include

using namespace std;

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

#define fork(i,k,n) for(int i=k;i<=n;i++)

#define rep(i,n) for(int i=0;i#define ford(i,n) for(int i=n;i;i--)

#define forkd(i,k,n) for(int i=n;i>=k;i--)

#define repd(i,n) for(int i=n;i>=0;i--)

#define forp(x) for(int p=pre[x];p;p=next[p])

#define forpiter(x) for(int &p=iter[x];p;p=next[p])

#define lson (o<<1)

#define rson ((o<<1)+1)

#define mem(a) memset(a,0,sizeof(a));

#define memi(a) memset(a,127,sizeof(a));

#define memi(a) memset(a,128,sizeof(a));

#define inf (2139062143)

#define f (100000007)

#define pb push_back

#define mp make_pair

#define eps (1e-1)

#define maxn (800000+10)

#define pi ((double)3.1415926535897932384626)

typedef long

long ll;

typedef complex cd;

class fft

j+=k;

}

}

void dft(int l,int on) //on }}

if (on==-1) rep(i,l) a[i].real()/=l;

//dft = 逆矩陣=-a/l

}void mem(int _n)

void scan(int *a,int n)

}}s1,s2;

int n,a[maxn]=,b[maxn]=;

int main()

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