代码太丑,就不贴了,有时间的话写一下讲解....
#include <cmath> #include <cctype> #include <cstdio> #include <cstring> #include <string> #include <algorithm> using namespace std; void setIO(string a){ freopen((a+".in").c_str(),"r",stdin);} const int maxn = 2e6+5; const double pi=3.1415926535898; int t, n, m, len=1, l, r[maxn*2]; struct Cpx{ double x,y; Cpx (double t1=0,double t2=0){x=t1,y=t2;} }A[maxn<<1],B[maxn<<1],C[maxn<<1]; Cpx operator+(Cpx a,Cpx b){ return Cpx(a.x+b.x,a.y+b.y);} Cpx operator - (Cpx a, Cpx b){ return Cpx(a.x-b.x, a.y-b.y); } Cpx operator * (Cpx a, Cpx b){ return Cpx(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x); } void FFT(Cpx *a,int n,int flag){ for(int i=0;i<n;++i) if(i<r[i]) swap(a[i],a[r[i]]); for(int mid=1;mid<n;mid<<=1){ Cpx wn(cos(pi/mid), flag*sin(pi/mid)),x,y; for(int j=0;j<n;j+=(mid<<1)){ Cpx w(1,0); for(int k=0;k<mid;++k) { x=a[j+k],y=w*a[j+mid+k]; a[j+k]=x+y; a[j+mid+k]=x-y; w=w*wn; } } } } int main(){ //setIO("input"); scanf("%d%d",&n,&m); int x; for(int i=0;i<=n;++i) scanf("%d",&x), A[i].x=x; for(int i=0;i <=m;++i) scanf("%d",&x),B[i].x=x; while(len<=n+m) len<<=1, ++l; for(int i=0;i<len;++i) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1)); FFT(A,len,1),FFT(B,len,1); for(int i=0;i<len;++i) C[i]=A[i]*B[i]; FFT(C,len,-1); for(int i=0;i<=n+m;++i) printf("%d ",int(C[i].x/len+0.5)); return 0; }