样例输出 1 5 7 3
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#define N 1048577
using namespace std;
struct complex
{
double x;
double y;
complex(): x(0),y(0){}
complex(double X,double Y):x(X),y(Y) {}
complex operator +(const complex& suc)
{
return complex(x+suc.x,y+suc.y);
}
complex operator -(const complex& suc)
{
return complex(x-suc.x,y-suc.y);
}
complex operator *(const complex& suc)
{
return complex(x*suc.x-y*suc.y,x*suc.y+y*suc.x);
}
};
const double Pi=acos(-1);
complex A[N],B[N],ANS[N<<1];
int DD[N<<1];
int n,m;
int tot,t;
void FFT(complex* Z,int type)
{
for(int i=0;i<tot;i++)
if(i<DD[i]) swap(Z[i],Z[DD[i]]);
for(int mid=1;mid<tot;mid=mid<<1)
{
complex r(cos(Pi/mid),type*sin(Pi/mid));
for(int R=mid<<1,j=0;j<tot;j=j+R)
{
complex m(1,0);
for(int k=0;k<mid;k++,m=m*r)
{
complex x=Z[j+k],y=m*Z[j+mid+k];
Z[j+k]=x+y,Z[j+mid+k]=x-y;
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=0;i<=n;i++) cin>>A[i].x;
for(int i=0;i<=m;i++) cin>>B[i].x;
n=n+m;
tot=1,t=0;
while(tot<=n) tot=tot<<1,t++;
for(int i=0;i<tot;i++) DD[i]=(DD[i>>1]>>1)+((i&1)<<(t-1));
FFT(A,1);
FFT(B,1);
for(int i=0;i<tot;i++) A[i]=A[i]*B[i];
FFT(A,-1);
for(int i=0;i<=n;i++)
{
printf("%.0lf ",A[i].x/n);
}
return 0;
}