\(\color{blue}{Code}\)
#include<bits/stdc++.h> using namespace std; const int N=3000006; const double pi=acos(-1.0); struct cp { double x,y; cp (double xx=0,double yy=0) { x=xx,y=yy; } } a[N],b[N]; cp operator + (const cp &a,const cp &b) { return cp(a.x+b.x,a.y+b.y); } cp operator - (const cp &a,const cp &b) { return cp(a.x-b.x,a.y-b.y); } cp operator * (const cp &a,const cp &b) { return cp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x); } int n,m,lim=1,l,rev[N]; void fft(cp *a,int o) { for(int i=0; i<lim; ++i) if(i<rev[i])swap(a[i],a[rev[i]]); for(int i=1; i<lim; i<<=1) { cp wn(cos(pi/i),o*sin(pi/i)); for(int j=0; j<lim; j+=(i<<1)) { cp w0(1,0); for(int k=0; k<i; ++k,w0=w0*wn) { cp X=a[j+k],Y=w0*a[i+j+k]; a[j+k]=X+Y; a[i+j+k]=X-Y; } } } } int main() { scanf("%d%d",&n,&m); for(int i=0; i<=n; ++i)scanf("%lf",&a[i].x); for(int i=0; i<=m; ++i)scanf("%lf",&b[i].x); for(; lim<=n+m; lim<<=1,++l); for(int i=0; i<lim; ++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1)); fft(a,1); fft(b,1); for(int i=0; i<lim; ++i)a[i]=a[i]*b[i]; fft(a,-1); for(int i=0; i<=m+n; ++i) printf("%d ",(int)(a[i].x/lim+0.5)); return 0; }
来源:https://www.cnblogs.com/zzctommy/p/12327760.html