- P3803 【模板】多项式乘法(FFT)
/*
雲璃猫猫が好きです
すべての生命よ,歌のように輝いています
截剣式、斬、断、破です!
*/
#include<bits/stdc++.h>
#include<bits/extc++.h>
#define INF 1e18
#define lb double
#define ls (id<<1)
#define rs (id<<1|1)
#define rep(i,l,r,k) for(int i=(l);i<=(r);i+=(k))
#define dep(i,r,l,k) for(int i=(r);i>=(l);i-=(k))
#define tep(ch,cr) for(auto ch:cr)
#define mk(a,b) make_pair(a,b)
#define me(a,b) memset(a,b,sizeof(a))
#define pb(x) push_back(x)
#define pr putchar
#define fi first
#define se second
#define wl while
#define max(a,b)((a)>(b)?(a):(b))
#define min(a,b)((a)<(b)?(a):(b))
using namespace std;
random_device rd;
unsigned int seed=rd();
mt19937 Rand(seed);
typedef pair<int,int> pii;
const int M=5e6+110,mod=1e9+7,Mod=998244353;
__gnu_pbds::gp_hash_table<string,int>ml;
inline int read(){int sum=0,k=1;char c=getchar();
while(c>'9'||c<'0'){if(c=='-')k=-1;c=getchar();
}while(c>='0'&&c<='9'){sum=sum*10+c-48;c=getchar();
}return sum*k;
}inline void wr(int x){if(x<0) putchar('-'),x=-x;
if(x>9) wr(x/10);return void(putchar(x%10+'0'));}
const lb pi=acos(-1.0);
struct Node{
lb x,y;
//A=x+yi
//复数加减乘
inline Node operator+(const Node &X)const{
Node C;
C.x=X.x+x;C.y=y+X.y;
return C;
}
inline Node operator-(const Node &X)const{
Node C;
C.x=x-X.x;C.y=y-X.y;
return C;
}
inline Node operator*(const Node &X)const{
Node C;
C.x=(x*X.x)-(y*X.y);
C.y=(x*X.y)+(y*X.x);
return C;
}
}a[M],b[M];
inline void FFT(Node *res,int n,int id){
if(n==1) return void();//边界
Node a1[n],b1[n];//分割
rep(i,0,n-1,2)
a1[i>>1]=res[i],//奇偶分
b1[i>>1]=res[i+1];
FFT(a1,n>>1,id);FFT(b1,n>>1,id);//递归
Node w=(Node){//增加量
cos(2.0*pi/(lb)n),
id*sin(2.0*pi/(lb)n)
},x=(Node){1,0};
rep(i,0,(n>>1)-1,1){//回推
res[i]=a1[i]+x*b1[i];
res[i+(n>>1)]=a1[i]-x*b1[i];
x=x*w;
}
}
int n,m,mx=1;
signed main(){
n=read(),m=read();
rep(i,0,n,1) cin>>a[i].x;rep(i,0,m,1) cin>>b[i].x;
wl(mx<=m+n) mx<<=1;
FFT(a,mx,1);FFT(b,mx,1);//变点值
rep(i,0,mx,1) a[i]=a[i]*b[i];//转出新点值
FFT(a,mx,-1);//转回系数
rep(i,0,m+n,1)
wr((int)(a[i].x/mx+0.5)),pr(' ');
return 0;
}