#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#define pi 3.141592653589793238462643387
using namespace std;int n,m,v=1,rev[10000000],len;
struct f{
double x,y;
f(double xx=0,double yy=0){x=xx;y=yy;}
f operator +(const f &rhs)const{
return f(x+rhs.x,y+rhs.y);
}f operator -(const f &rhs)const{
return f(x-rhs.x,y-rhs.y);
}f operator *(const f &rhs)const{
return f(x*rhs.x-y*rhs.y,x*rhs.y+y*rhs.x);
}
}a[10000000],b[10000000];
void fft(f *a,int t){
for(int i=0;i<v;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
for(int i=1;i<v;i*=2){
f w=f(cos(pi/i),sin(pi/i)*t);
for(int r=i*2,j=0;j<v;j+=r){
f tp=f(1,0);
for(int k=0;k<i;k++,tp=tp*w){
f tx=a[j+k],ty=a[j+i+k]*tp;
a[j+k]=tx+ty;a[j+i+k]=tx-ty;
}
}
}
}int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++)scanf("%lf",&a[i].x);
for(int i=0;i<=m;i++)scanf("%lf",&b[i].x);
while(v<=n+m)v*=2,len++;
for(int i=0;i<v;i++)
rev[i]=(rev[i>>1]>>1)|((i&1)<<(len-1));
fft(a,1);fft(b,1);
for(int i=0;i<=v;i++)a[i]=a[i]*b[i];fft(a,-1);
for(int i=0;i<=n+m;i++)printf("%d ",(int)(a[i].x/v+0.5));
return 0;
}
转载于:https://www.cnblogs.com/rilisoft/p/10385312.html