看了很久, 还是不太懂 $fft$ 的原理orz, 但是也还好, 反正再难也是一个分治而已, 不用怕
存个板子, 以后肯定也还会用的到.
希望下次来的时候我已经懂了233
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <complex> #include <math.h> #define MAXN 3000010 #define cp complex<double> using namespace std; const double PI=acos(-1.0); int n,m,rev[MAXN],lim=1,bit; cp a[MAXN],b[MAXN]; int read(){ int x=0,f=1;char c=getchar(); while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();} return x*f; } void FFT(cp *a,int inv){ for(int i=0;i<lim;i++) if(i<rev[i]) swap(a[i],a[rev[i]]); for(int mid=1;mid<lim;mid<<=1){ cp wn(cos(PI/mid),inv*sin(PI/mid)); for(int i=0;i<lim;i+=mid*2){ cp w(1,0); for(int j=0;j<mid;j++,w*=wn){ cp x=a[i+j],y=w*a[i+j+mid]; a[i+j]=x+y,a[i+j+mid]=x-y; } } } } int main(){ n=read();m=read(); for(int i=0;i<=n;i++) a[i].real(read()); for(int i=0;i<=m;i++) b[i].real(read()); while(lim<=m+n) lim<<=1,bit++; for(int i=0;i<lim;i++) rev[i]=(rev[i>>1]>>1) | ((i&1)<<(bit-1)); FFT(a,1);FFT(b,1); for(int i=0;i<=lim;i++) a[i]*=b[i]; FFT(a,-1); for(int i=0;i<=n+m;i++) printf("%d ",(int)(a[i].real()/lim+0.5)); return 0; }