萌新刚学OI,求助FFT
查看原帖
萌新刚学OI,求助FFT
119261
7KByte楼主2020/8/2 20:08
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define N 4000005
using namespace std;
int n,m,t;
typedef double db;
const db pi = acos ( -1.0 ) ;
struct comp{
	db a,b;  // a+bi
	comp(db x=0,db y=0){a=x;b=y;}
}f[N],g[N];
comp operator+(comp x,comp y){return comp(x.a+y.a,x.b+y.b);}
comp operator-(comp x,comp y){return comp(x.a-y.a,x.b-y.b);}
comp operator*(comp x,comp y){return comp(x.a*y.a-x.b*y.b,x.a*y.b+x.b*y.a);}
int rev[N];
void fft(comp *u,int op){
	rep(i,0,t-1)if(rev[i]>i)swap(u[rev[i]],u[i]);
	for(int k=2;k<=t;k<<=1){
		int l=k>>1;
		comp w(cos(pi/l),sin(pi/l)*op);
		for(int i=0;i<t;i+=k){
			comp now(1,0);
			rep(j,0,l-1){
				comp x=u[i+j],y=u[i+j+l]*now;
				u[i+j]=x+y;
				u[i+j+l]=x-y;
				now=now*w;
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	rep(i,0,n)scanf("%lf",&f[i].a);
	rep(i,0,n)scanf("%lf",&g[i].a);
	int b=0;
	for(t=1;t<=n+m;t<<=1,b++);
	rep(i,0,t-1)rev[i]=(rev[i>>1]>>1)|((i&1)<<(b-1));
	fft(f,1);fft(g,1);
	rep(i,0,t-1)f[i]=f[i]*g[i];
	fft(f,-1);
	rep(i,0,n+m)printf("%d ",(int)(f[i].a/t+0.5));
	return 0;
}
2020/8/2 20:08
加载中...