#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=4e6+500;
const double PI=acos(-1.0);
int n,m,limit=1,l,r[N];
struct complex {
double x,y;
complex(double xx=0,double yy=0) {
x=xx,y=yy;
}
} a[N],b[N];
complex operator + (complex a,complex b) {
return complex(a.x+b.x,a.y+b.y);
}
complex operator - (complex a,complex b) {
return complex(a.x-b.x,a.y-b.y);
}
complex operator * (complex a,complex b) {
return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
}
void fft(complex *A,int type) {
for(int i=0; i<limit; ++i) {
if(i<r[i])swap(A[i],A[r[i]]);
}
for(int mid=1; mid<limit; mid<<=1) {
complex wn(cos(PI/mid),type*sin(PI/mid));
for(int R=mid<<1,j=0; j<limit; j+=R) {
complex w(1,0);
for(int k=0; k<mid; ++k,w=w*wn) {
complex x=A[j+k],y=w*A[j+mid+k];
A[j+k]=x+y;
A[j+mid+k]=x-y;
}
}
}
}
int main() {
scanf("%d %d",&n,&m);
for(int i=0; i<=n; ++i) {
int sum;
scanf("%d",&sum);
a[i].x=1.0*sum;
}
for(int i=0; i<=m; ++i) {
int sum=0;
scanf("%d",&sum);
b[i].x=1.0*sum;
}
while(limit<=n+m)limit<<=1,l++;
for(int i=0; i<limit; ++i) {
r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
}
fft(a,1);
fft(b,1);
for(int i=0; i<limit; ++i)a[i]=a[i]*b[i];
fft(a,-1);
for(int i=0; i<n+m+1; ++i) {
printf("%d ",(int)(a[i].x/limit+0.5));
}
printf("\n");
return 0;
}
快速傅里叶变换(FFT)
最新推荐文章于 2024-07-31 00:30:00 发布