#include<bits/stdc++.h>
#define M 262150
#define eps 1e-7
using namespace std;
inline int read()
{
char c=getchar(); int ret=0;
while(c<48||c>57)c=getchar();
while(c>=48&&c<=57)ret=ret*10+c-48,c=getchar();
return ret;
}
struct fushu
{
double r, i;
fushu(){
r=0;
i=0;
}
fushu (double _r, double _i){
r=_r;
i=_i;
}
fushu operator + (const fushu & a)
{
return (fushu){r+a.r,i+a.i};
}
fushu operator - (const fushu & a)
{
return (fushu){r-a.r,i-a.i};
}
fushu operator * (const fushu & a)
{
return (fushu){r*a.r-i*a.i,r*a.i+i*a.r};
}
};
int N,n,m;
fushu *ans,wn[M],tmp[M],a[M],b[M];
inline void init_wn()
{
double pi=acos(-1);
double WN=2.0*pi/N;
for(int i=0; i<=N; ++i)
{
wn[i]=(fushu){cos(WN*i),sin(WN*i)};
}
}
inline void rev_wn()
{
for(int i=0; i<=N; ++i)wn[i].i=-wn[i].i;
}
void fft(int n, int s1 , int mi)
{
if (n==1)return;
int m=n>>1,len=1<<mi,s2=s1+len;
fft(m,s1,mi+1); fft(m,s2,mi+1);
int p=s1;
for(int i=0; i<m; ++i,p+=len<<1)
{
fushu del=ans[p+len]*wn[i<<mi];
tmp[i]=ans[p]+del;
tmp[i+m]=ans[p]-del;
}
for(int i=0; i<n; ++i)ans[s1+(i<<mi)]=tmp[i];
}
int main()
{
n=read(); m=read();
for(int i=0; i<=n; ++i)a[i].r=read();
for(int i=0; i<=m; ++i)b[i].r=read();
N=1; while(n+m>=N)N<<=1;
ans=a;
init_wn();
fft(N,0,0);
ans=b;
fft(N,0,0);
for(int i=0; i<N; ++i)a[i]=a[i]*b[i];
ans=a;
rev_wn();
fft(N,0,0);
for(int i=0; i<N; ++i)a[i].r=a[i].r/N;
for(int i=0; i<=n+m; ++i)printf("%d ",(int)(a[i].r+eps));
}
uoj34 FFT
最新推荐文章于 2019-01-01 18:07:00 发布