#line 1 "test/gcd_convolutiion.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/gcd_convolution"
#include <bits/stdc++.h>
usingnamespacestd;#line 3 "math/mint.cpp"
usingnamespacestd;template<intMOD>structModInt{public:longlongx;ModInt(longlongx=0):x((x%MOD+MOD)%MOD){}constexprModInt&operator+=(constModInta)noexcept{if((x+=a.x)>=MOD)x-=MOD;return*this;}constexprModInt&operator-=(constModInta)noexcept{if((x+=MOD-a.x)>=MOD)x-=MOD;return*this;}constexprModInt&operator*=(constModInta)noexcept{(x*=a.x)%=MOD;return*this;}constexprModInt&operator/=(constModInta)noexcept{return*this*=a.inverse();}constexprModIntoperator+(constModInta)constnoexcept{returnModInt(*this)+=a.x;}constexprModIntoperator-(constModInta)constnoexcept{returnModInt(*this)-=a.x;}constexprModIntoperator*(constModInta)constnoexcept{returnModInt(*this)*=a.x;}constexprModIntoperator/(constModInta)constnoexcept{returnModInt(*this)/=a.x;}friendconstexprstd::ostream&operator<<(std::ostream&os,constModInt<MOD>a)noexcept{returnos<<a.x;}friendconstexprstd::istream&operator>>(std::istream&is,ModInt<MOD>&a)noexcept{is>>a.x;a.x=(a.x%MOD+MOD)%MOD;returnis;}ModIntinverse()constnoexcept{// x ^ (-1)longlonga=x,b=MOD,p=1,q=0;while(b){longlongd=a/b;a-=d*b;swap(a,b);p-=d*q;swap(p,q);}returnModInt(p);}ModIntpow(longlongN)constnoexcept{// x ^ NModInta=1;ModInty=this->x;while(N){if(N&1)a*=y;y*=y;N>>=1;}returna;}};template<typenameU,intMOD>inlineModInt<MOD>operator*(constU&c,constModInt<MOD>&a){return{c*a.x};}usingmint=ModInt<998244353>;#line 3 "math/zeta.cpp"
usingnamespacestd;// a <= b <=> a <= b// g[x] = \\sum_{ i <= x } f[i]template<classR>structZetaOrder{// TODO:verifypublic:ZetaOrder(){}voidzeta(std::vector<R>&f){intsz=(int)f.size();for(intx=1;x<sz;x++){f[x]+=f[x-1];}}voidmebius(std::vector<R>&f){intsz=(int)f.size();for(intx=sz-1;x>=1;x--){f[x]-=f[x-1];}}std::vector<R>convolve(std::vector<R>f,std::vector<R>g){intsz=std::max((int)f.size(),(int)g.size());f.resize(sz,0);g.resize(sz,0);zeta(f);zeta(g);std::vector<R>h(sz);for(inti=0;i<sz;i++){h[i]=f[i]*g[i];}mebius(h);returnh;}};// min_pow2 returns minimum power of 2 larger than x (x <= 2^i)// and i (pair{i,2^i}).// x must be more than 0template<classT>std::pair<int,T>min_pow2(Tx){inti=0;Tret=1;while(x>ret){i++;ret<<=1;}returnstd::make_pair(i,ret);}// S <= T <=> S \subset T// g[T] = \sum_{ S \subset T } f[S]template<classR>structZetaSubset{// TODO:verifyprivate:// min_pow2 returns minimum power of 2 larger than x (x <= 2^i)// and i (pair{i,2^i}).// x must be more than 0std::pair<int,int>min_pow2(intx){inti=0;intret=1;while(x>ret){i++;ret<<=1;}returnstd::make_pair(i,ret);}public:ZetaSubset(){}voidzeta(std::vector<R>&f){auto[d,sz]=min_pow2((int)f.size());f.resize(sz,(R)0);for(inti=0;i<d;i++){for(intT=0;T<sz;T++){if(T&(1<<i))f[T]+=f[T^(1<<i)];}}}voidmebius(std::vector<R>&f){auto[d,sz]=min_pow2((int)f.size());f.resize(sz,(R)0);for(inti=0;i<d;i++){for(intT=0;T<sz;T++){if(T&(1<<i))f[T]-=f[T^(1<<i)];}}}std::vector<R>convolve(std::vector<R>f,std::vector<R>g){intsz=std::max((int)f.size(),(int)g.size());f.resize(sz,0);g.resize(sz,0);zeta(f);zeta(g);std::vector<R>h(sz);for(inti=0;i<sz;i++){h[i]=f[i]*g[i];}mebius(h);returnh;}};// a <= b <=> b | a// g[x] = \sum_{ x | i } f[i]template<classR>structZetaDiv{// TODO: O(nloglogn) zeta transformprivate:// min_pow2 returns minimum power of 2 larger than x (x <= 2^i)// and i (pair{i,2^i}).// x must be more than 0std::pair<int,int>min_pow2(intx){inti=0;intret=1;while(x>ret){i++;ret<<=1;}returnstd::make_pair(i,ret);}public:ZetaDiv(){}voidzeta(std::vector<R>&f){intsz=(int)f.size();for(intx=1;x<sz;x++){for(inti=2*x;i<sz;i+=x){f[x]+=f[i];}}}voidmebius(std::vector<R>&f){intsz=(int)f.size();for(intx=sz-1;x>=1;x--){for(inti=2*x;i<sz;i+=x){f[x]-=f[i];}}}std::vector<R>convolve(std::vector<R>f,std::vector<R>g){intsz=std::min((int)f.size(),(int)g.size());zeta(f);zeta(g);std::vector<R>h(sz);for(inti=0;i<sz;i++){h[i]=f[i]*g[i];}mebius(h);returnh;}};#line 7 "test/gcd_convolutiion.test.cpp"
intmain(){intn;cin>>n;vector<mint>A(n+1),B(n+1);for(inti=1;i<=n;i++)cin>>A[i];for(inti=1;i<=n;i++)cin>>B[i];ZetaDiv<mint>zeta;autoC=zeta.convolve(A,B);for(inti=1;i<=n;i++)cout<<C[i]<<' ';cout<<'\n';}