参考题目:LOJ108多项式乘法
解析:
zxyoi什么时候有心情什么时候更新板子题解析。。。
代码:
#include<bits/stdc++.h>
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const
inline int getint(){
re int num;
re char c;
while(!isdigit(c=gc()));num=c^48;
while(isdigit(c=gc()))num=(num+(num<<2)<<1)+(c^48);
return num;
}
cs double pi=acos(-1.0);
cs int N=1000005;
struct complex{
double x,y;
complex(cs double &_x=0,cs double &_y=0):x(_x),y(_y){}
friend complex operator+(cs complex &a,cs complex &b){return complex(a.x+b.x,a.y+b.y);}
friend complex operator-(cs complex &a,cs complex &b){return complex(a.x-b.x,a.y-b.y);}
friend complex operator*(cs complex &a,cs complex &b){return complex(a.x*b.x-a.y*b.y,a.x*b.y+b.x*a.y);}
}a[N<<1],b[N<<1];
int limit=1,l,r[N<<1],n,m;
inline void FFT(complex *cs A,int type){
for(int re i=0;i<limit;++i)
if(i<r[i])std::swap(A[i],A[r[i]]);
for(int re mid=1;mid<limit;mid<<=1){
re complex wn(cos(pi/mid),type*sin(pi/mid));
for(int re len=mid<<1,j=0;j<limit;j+=len){
re complex w(1,0);
for(int re k=0;k<mid;++k,w=w*wn){
re complex x=A[j+k],y=w*A[j+mid+k];
A[j+k]=x+y;
A[j+mid+k]=x-y;
}
}
}
}
signed main(){
n=getint();
m=getint();
for(int re i=0;i<=n;++i)a[i].x=getint();
for(int re i=0;i<=m;++i)b[i].x=getint();
while(limit<=n+m)++l,limit<<=1;
for(int re i=0;i<limit;++i)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
FFT(a,1);
FFT(b,1);
for(int re i=0;i<=limit;++i)a[i]=a[i]*b[i];
FFT(a,-1);
for(int re i=0;i<=n+m;++i)printf("%d ",(int)(a[i].x/limit+0.5));
return 0;
}