#include<bits/stdc++.h>
#define cp complex<double>
using namespace std;
const int maxn=(1<<20)+10;
const double PI=acos(-1);
cp a[maxn],b[maxn],omg[maxn],inv[maxn];
int n=1;
void fftinit()
{
for(int i=0;i<n;i++)
{
omg[i]=cp(cos(2*PI*i/n),sin(2*PI*i/n));
inv[i]=conj(omg[i]);
}
}
void fft(cp *a,cp *omg)
{
int lim=0;
while((1<<lim)<n) lim++;
for(int i=0;i<n;i++)
{
int t=0;
for(int j=0;j<lim;j++)
if((i>>j)&1) t|=(1<<(lim-j-1));
if(i<t) swap(a[i],a[t]);
}
for(int l=2;l<=n;l*=2)
{
int m=1/2;
for(cp *p=a;p!=a+n;p+=l)
for(int i=0;i<m;i++)
{
cp t=omg[n/l*i]*p[i+m];
p[i+m]=p[i]-t;
p[i]+=t;
}
}
}
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main()
{
int n1,m1;
n1=read();m1=read();
while(n<n1+m1) n*=2;
int tmp;
for(int i=0;i<=n1;i++)
{
tmp=read();
a[i].real(tmp);
}
for(int i=0;i<=m1;i++)
{
tmp=read();
b[i].real(tmp);
}
fftinit();
fft(a,omg);
fft(b,omg);
for(int i=0;i<n;i++) a[i]*=b[i];
fft(a,inv);
for(int i=0;i<n;i++) printf("%d ",int(a[i].real()/n+0.5));
return 0;
}
没想懂,抄胡小兔的