#define PROBLEM "https://judge.yosupo.jp/problem/convolution_mod_1000000007"
//#include"../../template/template.hpp"//#include"../../misc/fastio.hpp"
#include"../../ntt/complex-fft.hpp"namespaceArbitraryModConvolution{// naive Toom-3template<unsignedintMOD>vector<int>toom_3(constvector<int>&a,constvector<int>&b){autoprecalc=[](constvector<int>&_a)->array<vector<int>,5>{intn=_a.size();vector<int>p0(n),p1(n),pm1(n),pm2(n),pinf(n);for(inti=0;i<n;i++){intm0=_a[i]&1023;intm1=(_a[i]>>10)&1023;intm2=(_a[i]>>20)&1023;p0[i]=m0;p1[i]=m0+m1+m2;pm1[i]=m0-m1+m2;pm2[i]=m0-2*m1+4*m2;pinf[i]=m2;}return{{p0,p1,pm1,pm2,pinf}};};auto[a0,a1,am1,am2,ainf]=precalc(a);auto[b0,b1,bm1,bm2,binf]=precalc(b);autoc0=CooleyTukey::multiply(a0,b0);autoc1=CooleyTukey::multiply(a1,b1);autocm1=CooleyTukey::multiply(am1,bm1);autocm2=CooleyTukey::multiply(am2,bm2);autocinf=CooleyTukey::multiply(ainf,binf);vector<int>c(c0.size());for(inti=0;i<(int)c.size();i++){longlongr0=c0[i];longlongr4=cinf[i];longlongr3=(cm2[i]-c1[i])/3;longlongr1=(c1[i]-cm1[i])/2;longlongr2=cm1[i]-c0[i];r3=(r2-r3)/2+r4*2;r2+=r1-r4;r1-=r3;longlongret=r4%MOD*1048576;ret+=r3%MOD*1024+r2;ret=ret%MOD*1048576;ret+=r1%MOD*1024+r0;ret%=MOD;if(ret<0)ret+=MOD;c[i]=ret;}returnc;}}// namespace ArbitraryModConvolutionvoidNyaan::solve(){usingnamespaceArbitraryModConvolution;intN,M;rd(N,M);vector<int>a(N),b(M);for(auto&x:a)rd(x);for(auto&x:b)rd(x);autoc=toom_3<1000000007>(a,b);// auto c = CooleyTukey::karatsuba<1000000007>(a, b);for(inti=0;i<N+M-1;i++){wt(c[i]," \n"[i==N+M-2]);}}
#line 1 "verify/verify-yosupo-ntt/yosupo-convolution-real-fft-toom-3.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/convolution_mod_1000000007"
//#line 2 "template/template.hpp"
usingnamespacestd;// intrinstic#include<immintrin.h>#include<algorithm>
#include<array>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cfenv>
#include<cfloat>
#include<chrono>
#include<cinttypes>
#include<climits>
#include<cmath>
#include<complex>
#include<cstdarg>
#include<cstddef>
#include<cstdint>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<deque>
#include<fstream>
#include<functional>
#include<initializer_list>
#include<iomanip>
#include<ios>
#include<iostream>
#include<istream>
#include<iterator>
#include<limits>
#include<list>
#include<map>
#include<memory>
#include<new>
#include<numeric>
#include<ostream>
#include<queue>
#include<random>
#include<set>
#include<sstream>
#include<stack>
#include<streambuf>
#include<string>
#include<tuple>
#include<type_traits>
#include<typeinfo>
#include<unordered_map>
#include<unordered_set>
#include<utility>
#include<vector>// utility#line 3 "template/util.hpp"
namespaceNyaan{usingll=longlong;usingi64=longlong;usingu64=unsignedlonglong;usingi128=__int128_t;usingu128=__uint128_t;template<typenameT>usingV=vector<T>;template<typenameT>usingVV=vector<vector<T>>;usingvi=vector<int>;usingvl=vector<longlong>;usingvd=V<double>;usingvs=V<string>;usingvvi=vector<vector<int>>;usingvvl=vector<vector<longlong>>;template<typenameT>usingminpq=priority_queue<T,vector<T>,greater<T>>;template<typenameT,typenameU>structP:pair<T,U>{template<typename...Args>P(Args...args):pair<T,U>(args...){}usingpair<T,U>::first;usingpair<T,U>::second;P&operator+=(constP&r){first+=r.first;second+=r.second;return*this;}P&operator-=(constP&r){first-=r.first;second-=r.second;return*this;}P&operator*=(constP&r){first*=r.first;second*=r.second;return*this;}template<typenameS>P&operator*=(constS&r){first*=r,second*=r;return*this;}Poperator+(constP&r)const{returnP(*this)+=r;}Poperator-(constP&r)const{returnP(*this)-=r;}Poperator*(constP&r)const{returnP(*this)*=r;}template<typenameS>Poperator*(constS&r)const{returnP(*this)*=r;}Poperator-()const{returnP{-first,-second};}};usingpl=P<ll,ll>;usingpi=P<int,int>;usingvp=V<pl>;constexprintinf=1001001001;constexprlonglonginfLL=4004004004004004004LL;template<typenameT>intsz(constT&t){returnt.size();}template<typenameT,typenameU>inlineboolamin(T&x,Uy){return(y<x)?(x=y,true):false;}template<typenameT,typenameU>inlineboolamax(T&x,Uy){return(x<y)?(x=y,true):false;}template<typenameT>inlineTMax(constvector<T>&v){return*max_element(begin(v),end(v));}template<typenameT>inlineTMin(constvector<T>&v){return*min_element(begin(v),end(v));}template<typenameT>inlinelonglongSum(constvector<T>&v){returnaccumulate(begin(v),end(v),0LL);}template<typenameT>intlb(constvector<T>&v,constT&a){returnlower_bound(begin(v),end(v),a)-begin(v);}template<typenameT>intub(constvector<T>&v,constT&a){returnupper_bound(begin(v),end(v),a)-begin(v);}constexprlonglongTEN(intn){longlongret=1,x=10;for(;n;x*=x,n>>=1)ret*=(n&1?x:1);returnret;}template<typenameT,typenameU>pair<T,U>mkp(constT&t,constU&u){returnmake_pair(t,u);}template<typenameT>vector<T>mkrui(constvector<T>&v,boolrev=false){vector<T>ret(v.size()+1);if(rev){for(inti=int(v.size())-1;i>=0;i--)ret[i]=v[i]+ret[i+1];}else{for(inti=0;i<int(v.size());i++)ret[i+1]=ret[i]+v[i];}returnret;};template<typenameT>vector<T>mkuni(constvector<T>&v){vector<T>ret(v);sort(ret.begin(),ret.end());ret.erase(unique(ret.begin(),ret.end()),ret.end());returnret;}template<typenameF>vector<int>mkord(intN,Ff){vector<int>ord(N);iota(begin(ord),end(ord),0);sort(begin(ord),end(ord),f);returnord;}template<typenameT>vector<int>mkinv(vector<T>&v){intmax_val=*max_element(begin(v),end(v));vector<int>inv(max_val+1,-1);for(inti=0;i<(int)v.size();i++)inv[v[i]]=i;returninv;}vector<int>mkiota(intn){vector<int>ret(n);iota(begin(ret),end(ret),0);returnret;}template<typenameT>Tmkrev(constT&v){Tw{v};reverse(begin(w),end(w));returnw;}template<typenameT>boolnxp(T&v){returnnext_permutation(begin(v),end(v));}// 返り値の型は入力の T に依存// i 要素目 : [0, a[i])template<typenameT>vector<vector<T>>product(constvector<T>&a){vector<vector<T>>ret;vector<T>v;autodfs=[&](autorc,inti)->void{if(i==(int)a.size()){ret.push_back(v);return;}for(intj=0;j<a[i];j++)v.push_back(j),rc(rc,i+1),v.pop_back();};dfs(dfs,0);returnret;}// F : void(T&), mod を取る操作// T : 整数型のときはオーバーフローに注意するtemplate<typenameT,typenameF>TPower(Ta,longlongn,constT&I,F&&f){static_assert(std::is_invocable_r_v<void,F&,T&>,"Power callback must be callable as void(T&)");Tres=I;for(;n;std::invoke(f,a=a*a),n>>=1){if(n&1)std::invoke(f,res=res*a);}returnres;}// T : 整数型のときはオーバーフローに注意するtemplate<typenameT>TPower(Ta,longlongn,constT&I=T{1}){autono_op=[](T&)->void{};returnPower(a,n,I,no_op);}template<typenameT>TRev(constT&v){Tres=v;reverse(begin(res),end(res));returnres;}template<typenameT>vector<T>Transpose(constvector<T>&v){usingU=typenameT::value_type;if(v.empty())return{};intH=v.size(),W=v[0].size();vectorres(W,T(H,U{}));for(inti=0;i<H;i++){for(intj=0;j<W;j++){res[j][i]=v[i][j];}}returnres;}template<typenameT>vector<T>Rotate(constvector<T>&v,intclockwise=true){usingU=typenameT::value_type;intH=v.size(),W=v[0].size();vectorres(W,T(H,U{}));for(inti=0;i<H;i++){for(intj=0;j<W;j++){if(clockwise){res[W-1-j][i]=v[i][j];}else{res[j][H-1-i]=v[i][j];}}}returnres;}}// namespace Nyaan#line 58 "template/template.hpp"
// bit operation#line 1 "template/bitop.hpp"
namespaceNyaan{__attribute__((target("popcnt")))inlineintpopcnt(constu64&a){return__builtin_popcountll(a);}inlineintlsb(constu64&a){returna?__builtin_ctzll(a):64;}inlineintctz(constu64&a){returna?__builtin_ctzll(a):64;}inlineintmsb(constu64&a){returna?63-__builtin_clzll(a):-1;}template<typenameT>inlineintgbit(constT&a,inti){return(a>>i)&1;}template<typenameT>inlinevoidsbit(T&a,inti,boolb){if(gbit(a,i)!=b)a^=T(1)<<i;}constexprlonglongPW(intn){return1LL<<n;}constexprlonglongMSK(intn){return(1LL<<n)-1;}}// namespace Nyaan#line 61 "template/template.hpp"
// inout#line 1 "template/inout.hpp"
namespaceNyaan{template<typenameT,typenameU>ostream&operator<<(ostream&os,constpair<T,U>&p){os<<p.first<<" "<<p.second;returnos;}template<typenameT,typenameU>istream&operator>>(istream&is,pair<T,U>&p){is>>p.first>>p.second;returnis;}template<typenameT>ostream&operator<<(ostream&os,constvector<T>&v){ints=(int)v.size();for(inti=0;i<s;i++)os<<(i?" ":"")<<v[i];returnos;}template<typenameT>istream&operator>>(istream&is,vector<T>&v){for(auto&x:v)is>>x;returnis;}istream&operator>>(istream&is,__int128_t&x){stringS;is>>S;x=0;intflag=0;for(auto&c:S){if(c=='-'){flag=true;continue;}x*=10;x+=c-'0';}if(flag)x=-x;returnis;}istream&operator>>(istream&is,__uint128_t&x){stringS;is>>S;x=0;for(auto&c:S){x*=10;x+=c-'0';}returnis;}ostream&operator<<(ostream&os,__int128_tx){if(x==0)returnos<<0;if(x<0)os<<'-',x=-x;stringS;while(x)S.push_back('0'+x%10),x/=10;reverse(begin(S),end(S));returnos<<S;}ostream&operator<<(ostream&os,__uint128_tx){if(x==0)returnos<<0;stringS;while(x)S.push_back('0'+x%10),x/=10;reverse(begin(S),end(S));returnos<<S;}voidin(){}template<typenameT,class...U>voidin(T&t,U&...u){cin>>t;in(u...);}voidout(){cout<<"\n";}template<typenameT,class...U,charsep=' '>voidout(constT&t,constU&...u){cout<<t;if(sizeof...(u))cout<<sep;out(u...);}structIoSetupNya{IoSetupNya(){cin.tie(nullptr);ios::sync_with_stdio(false);cout<<fixed<<setprecision(15);cerr<<fixed<<setprecision(7);}}iosetupnya;}// namespace Nyaan#line 64 "template/template.hpp"
// debug#line 1 "template/debug.hpp"
namespaceDebugImpl{template<typenameU,typename=void>structis_specialize:false_type{};template<typenameU>structis_specialize<U,typenameconditional<false,typenameU::iterator,void>::type>:true_type{};template<typenameU>structis_specialize<U,typenameconditional<false,decltype(U::first),void>::type>:true_type{};template<typenameU>structis_specialize<U,enable_if_t<is_integral<U>::value,void>>:true_type{};voiddump(constchar&t){cerr<<t;}voiddump(conststring&t){cerr<<t;}voiddump(constbool&t){cerr<<(t?"true":"false");}voiddump(__int128_tt){if(t==0)cerr<<0;if(t<0)cerr<<'-',t=-t;stringS;while(t)S.push_back('0'+t%10),t/=10;reverse(begin(S),end(S));cerr<<S;}voiddump(__uint128_tt){if(t==0)cerr<<0;stringS;while(t)S.push_back('0'+t%10),t/=10;reverse(begin(S),end(S));cerr<<S;}template<typenameU,enable_if_t<!is_specialize<U>::value,nullptr_t>=nullptr>voiddump(constU&t){cerr<<t;}template<typenameT>voiddump(constT&t,enable_if_t<is_integral<T>::value>*=nullptr){stringres;if(t==Nyaan::inf)res="inf";ifconstexpr(is_signed<T>::value){if(t==-Nyaan::inf)res="-inf";}ifconstexpr(sizeof(T)==8){if(t==Nyaan::infLL)res="inf";ifconstexpr(is_signed<T>::value){if(t==-Nyaan::infLL)res="-inf";}}if(res.empty())res=to_string(t);cerr<<res;}template<typenameT,typenameU>voiddump(constpair<T,U>&);template<typenameT>voiddump(constpair<T*,int>&);template<typenameT>voiddump(constT&t,enable_if_t<!is_void<typenameT::iterator>::value>*=nullptr){cerr<<"[ ";for(autoit=t.begin();it!=t.end();){dump(*it);cerr<<(++it==t.end()?"":", ");}cerr<<" ]";}template<typenameT,typenameU>voiddump(constpair<T,U>&t){cerr<<"( ";dump(t.first);cerr<<", ";dump(t.second);cerr<<" )";}template<typenameT>voiddump(constpair<T*,int>&t){cerr<<"[ ";for(inti=0;i<t.second;i++){dump(t.first[i]);cerr<<(i==t.second-1?"":", ");}cerr<<" ]";}voidtrace(){cerr<<endl;}template<typenameHead,typename...Tail>voidtrace(Head&&head,Tail&&...tail){cerr<<" ";dump(head);if(sizeof...(tail)!=0)cerr<<",";trace(std::forward<Tail>(tail)...);}}// namespace DebugImpl#ifdef NyaanDebug
#define trc(...) \
do { \
cerr << "## " << #__VA_ARGS__ << " = "; \
DebugImpl::trace(__VA_ARGS__); \
} while (0)
#else
#define trc(...) (void(0))
#endif
#ifdef NyaanLocal
#define trc2(...) \
do { \
cerr << "## " << #__VA_ARGS__ << " = "; \
DebugImpl::trace(__VA_ARGS__); \
} while (0)
#else
#define trc2(...) (void(0))
#endif
#line 67 "template/template.hpp"
// macro#line 1 "template/macro.hpp"
#define each(x, v) for (auto&& x : v)
#define each2(x, y, v) for (auto&& [x, y] : v)
#define all(v) (v).begin(), (v).end()
#define rep(i, N) for (long long i = 0; i < (long long)(N); i++)
#define repr(i, N) for (long long i = (long long)(N)-1; i >= 0; i--)
#define rep1(i, N) for (long long i = 1; i <= (long long)(N); i++)
#define repr1(i, N) for (long long i = (N); (long long)(i) > 0; i--)
#define reg(i, a, b) for (long long i = (a); i < (b); i++)
#define regr(i, a, b) for (long long i = (b)-1; i >= (a); i--)
#define fi first
#define se second
#define ini(...) \
int __VA_ARGS__; \
in(__VA_ARGS__)
#define inl(...) \
long long __VA_ARGS__; \
in(__VA_ARGS__)
#define ins(...) \
string __VA_ARGS__; \
in(__VA_ARGS__)
#define in2(s, t) \
for (int i = 0; i < (int)s.size(); i++) { \
in(s[i], t[i]); \
}
#define in3(s, t, u) \
for (int i = 0; i < (int)s.size(); i++) { \
in(s[i], t[i], u[i]); \
}
#define in4(s, t, u, v) \
for (int i = 0; i < (int)s.size(); i++) { \
in(s[i], t[i], u[i], v[i]); \
}
#define die(...) \
do { \
Nyaan::out(__VA_ARGS__); \
return; \
} while (0)
#line 70 "template/template.hpp"
namespaceNyaan{voidsolve();}intmain(){Nyaan::solve();}#line 4 "verify/verify-yosupo-ntt/yosupo-convolution-real-fft-toom-3.test.cpp"
//#line 2 "misc/fastio.hpp"
#line 9 "misc/fastio.hpp"
usingnamespacestd;#line 2 "internal/internal-type-traits.hpp"
#line 4 "internal/internal-type-traits.hpp"
usingnamespacestd;namespacenyaan_internal{template<typenameT>usingis_broadly_integral=typenameconditional_t<is_integral_v<T>||is_same_v<T,__int128_t>||is_same_v<T,__uint128_t>,true_type,false_type>::type;template<typenameT>usingis_broadly_signed=typenameconditional_t<is_signed_v<T>||is_same_v<T,__int128_t>,true_type,false_type>::type;template<typenameT>usingis_broadly_unsigned=typenameconditional_t<is_unsigned_v<T>||is_same_v<T,__uint128_t>,true_type,false_type>::type;#define ENABLE_VALUE(x) \
template <typename T> \
constexpr bool x##_v = x<T>::value;
ENABLE_VALUE(is_broadly_integral);ENABLE_VALUE(is_broadly_signed);ENABLE_VALUE(is_broadly_unsigned);#undef ENABLE_VALUE
#define ENABLE_HAS_TYPE(var) \
template <class, class = void> \
struct has_##var : false_type {}; \
template <class T> \
struct has_##var<T, void_t<typename T::var>> : true_type {}; \
template <class T> \
constexpr auto has_##var##_v = has_##var<T>::value;
#define ENABLE_HAS_VAR(var) \
template <class, class = void> \
struct has_##var : false_type {}; \
template <class T> \
struct has_##var<T, void_t<decltype(T::var)>> : true_type {}; \
template <class T> \
constexpr auto has_##var##_v = has_##var<T>::value;
}// namespace nyaan_internal#line 13 "misc/fastio.hpp"
namespacefastio{staticconstexprintSZ=1<<17;staticconstexprintoffset=64;charinbuf[SZ],outbuf[SZ];intin_left=0,in_right=0,out_right=0;structPre{charnum[40000];constexprPre():num(){for(inti=0;i<10000;i++){intn=i;for(intj=3;j>=0;j--){num[i*4+j]=n%10+'0';n/=10;}}}}constexprpre;voidload(){intlen=in_right-in_left;memmove(inbuf,inbuf+in_left,len);in_right=len+fread(inbuf+len,1,SZ-len,stdin);in_left=0;}voidflush(){fwrite(outbuf,1,out_right,stdout);out_right=0;}voidskip_space(){if(in_left+offset>in_right)load();while(inbuf[in_left]<=' ')in_left++;}voidsingle_read(char&c){if(in_left+offset>in_right)load();skip_space();c=inbuf[in_left++];}voidsingle_read(string&S){skip_space();while(true){if(in_left==in_right)load();inti=in_left;for(;i!=in_right;i++){if(inbuf[i]<=' ')break;}copy(inbuf+in_left,inbuf+i,back_inserter(S));in_left=i;if(i!=in_right)break;}}template<typenameT,enable_if_t<nyaan_internal::is_broadly_integral_v<T>>*=nullptr>voidsingle_read(T&x){if(in_left+offset>in_right)load();skip_space();charc=inbuf[in_left++];[[maybe_unused]]boolminus=false;ifconstexpr(nyaan_internal::is_broadly_signed_v<T>){if(c=='-')minus=true,c=inbuf[in_left++];}x=0;while(c>='0'){x=x*10+(c&15);c=inbuf[in_left++];}ifconstexpr(nyaan_internal::is_broadly_signed_v<T>){if(minus)x=-x;}}voidrd(){}template<typenameHead,typename...Tail>voidrd(Head&head,Tail&...tail){single_read(head);rd(tail...);}voidsingle_write(constchar&c){if(out_right>SZ-offset)flush();outbuf[out_right++]=c;}voidsingle_write(constbool&b){if(out_right>SZ-offset)flush();outbuf[out_right++]=b?'1':'0';}voidsingle_write(conststring&S){flush(),fwrite(S.data(),1,S.size(),stdout);}voidsingle_write(constchar*p){flush(),fwrite(p,1,strlen(p),stdout);}template<typenameT,enable_if_t<nyaan_internal::is_broadly_integral_v<T>>*=nullptr>voidsingle_write(constT&_x){if(out_right>SZ-offset)flush();if(_x==0){outbuf[out_right++]='0';return;}Tx=_x;ifconstexpr(nyaan_internal::is_broadly_signed_v<T>){if(x<0)outbuf[out_right++]='-',x=-x;}constexprintbuffer_size=sizeof(T)*10/4;charbuf[buffer_size];inti=buffer_size;while(x>=10000){i-=4;memcpy(buf+i,pre.num+(x%10000)*4,4);x/=10000;}if(x<100){if(x<10){outbuf[out_right]='0'+x;++out_right;}else{uint32_tq=(uint32_t(x)*205)>>11;uint32_tr=uint32_t(x)-q*10;outbuf[out_right]='0'+q;outbuf[out_right+1]='0'+r;out_right+=2;}}else{if(x<1000){memcpy(outbuf+out_right,pre.num+(x<<2)+1,3);out_right+=3;}else{memcpy(outbuf+out_right,pre.num+(x<<2),4);out_right+=4;}}memcpy(outbuf+out_right,buf+i,buffer_size-i);out_right+=buffer_size-i;}voidwt(){}template<typenameHead,typename...Tail>voidwt(constHead&head,constTail&...tail){single_write(head);wt(std::forward<constTail>(tail)...);}template<typename...Args>voidwtn(constArgs&...x){wt(std::forward<constArgs>(x)...);wt('\n');}structDummy{Dummy(){atexit(flush);}}dummy;}// namespace fastiousingfastio::rd;usingfastio::skip_space;usingfastio::wt;usingfastio::wtn;#line 2 "ntt/complex-fft.hpp"
namespaceArbitraryModConvolution{template<typenameT>structCp{Tx,y;constexprCp():x(0),y(0){}constexprCp(T_x,T_y):x(_x),y(_y){}constexprinlineCpoperator+(constCp&c)const{returnCp(x+c.x,y+c.y);}constexprinlineCpoperator-(constCp&c)const{returnCp(x-c.x,y-c.y);}constexprinlineCpoperator*(constCp&c)const{returnCp(x*c.x-y*c.y,x*c.y+y*c.x);}constexprinlineCpoperator-()const{returnCp(-x,-y);}constexprinlineCpconj()const{returnCp(x,-y);}constexprinlineCprotl()const{returnCp(-y,x);}friendostream&operator<<(ostream&os,constCp&c){os<<"("<<c.x<<", "<<c.y<<")"<<endl;returnos;}};usingC=Cp<double>;constlongdoublePI=acosl(-1);structCooleyTukey{staticvector<C>w;staticvoidsetw(intk){--k;if((int)w.size()>=(1<<k))return;w.resize(1<<k);vector<Cp<longdouble>>base(k);constlongdoublearg=PI/(1<<k);for(inti=0,j=1<<(k-1);j;i++,j>>=1){complex<longdouble>z=exp(complex<longdouble>(1i)*(arg*j));base[i]=Cp<longdouble>{z.real(),z.imag()};}genw(0,k-1,Cp<longdouble>{1,0},base);}staticvoidgenw(inti,intb,Cp<longdouble>z,constvector<Cp<longdouble>>&base){if(b==-1){w[i].x=z.x,w[i].y=z.y;}else{genw(i,b-1,z,base);genw(i|(1<<b),b-1,z*base[b],base);}}staticvoidfft(vector<C>&a,intk){if(k<=0)return;if(k==1){Ca1=a[1];a[1]=a[0]-a[1];a[0]=a[0]+a1;return;}if(k&1){intv=1<<(k-1);for(intj=0;j<v;++j){Cajv=a[j+v];a[j+v]=a[j]-ajv;a[j]=a[j]+ajv;}}intu=1<<(k&1),v=1<<(k-2-(k&1));while(v){{intj0=0;intj1=v;intj2=j1+v;intj3=j2+v;intje=v;for(;j0<je;++j0,++j1,++j2,++j3){Ct0=a[j0],t1=a[j1],t2=a[j2],t3=a[j3];Ct0p2=t0+t2,t1p3=t1+t3;Ct0m2=t0-t2,t1m3=(t1-t3)*w[1];a[j0]=t0p2+t1p3,a[j1]=t0p2-t1p3;a[j2]=t0m2+t1m3,a[j3]=t0m2-t1m3;}}// jh >= 1for(intjh=1;jh<u;++jh){intj0=jh*v*4;intj1=j0+v;intj2=j1+v;intj3=j2+v;intje=j1;Cww=w[jh];Cxx=w[jh<<1];Cwx=ww*xx;for(;j0<je;++j0,++j1,++j2,++j3){Ct0=a[j0],t1=a[j1]*xx,t2=a[j2]*ww,t3=a[j3]*wx;Ct0p2=t0+t2,t1p3=t1+t3;Ct0m2=t0-t2,t1m3=(t1-t3)*w[1];a[j0]=t0p2+t1p3,a[j1]=t0p2-t1p3;a[j2]=t0m2+t1m3,a[j3]=t0m2-t1m3;}}u<<=2,v>>=2;}}staticvoidifft(vector<C>&a,intk){if((int)a.size()<=1)return;if(k==1){Ca1=a[1];a[1]=a[0]-a[1];a[0]=a[0]+a1;return;}intu=1<<(k-2);intv=1;while(u){// jh = 0{intj0=0;intj1=v;intj2=j1+v;intj3=j2+v;for(;j0<v;++j0,++j1,++j2,++j3){Ct0=a[j0],t1=a[j1],t2=a[j2],t3=a[j3];Ct0p1=t0+t1,t2p3=t2+t3;Ct0m1=t0-t1,t2m3=(t2-t3)*w[1].conj();a[j0]=t0p1+t2p3,a[j2]=t0p1-t2p3;a[j1]=t0m1+t2m3,a[j3]=t0m1-t2m3;}}// jh >= 1for(intjh=1;jh<u;++jh){intj0=(jh*v)<<2;intj1=j0+v;intj2=j1+v;intj3=j2+v;intje=j1;Cww=w[jh].conj();Cxx=w[jh<<1].conj();Cyy=w[(jh<<1)+1].conj();for(;j0<je;++j0,++j1,++j2,++j3){Ct0=a[j0],t1=a[j1],t2=a[j2],t3=a[j3];Ct0p1=t0+t1,t2p3=t2+t3;Ct0m1=(t0-t1)*xx,t2m3=(t2-t3)*yy;a[j0]=t0p1+t2p3,a[j2]=(t0p1-t2p3)*ww;a[j1]=t0m1+t2m3,a[j3]=(t0m1-t2m3)*ww;}}u>>=2;v<<=2;}if(k&1){u=1<<(k-1);for(intj=0;j<u;j++){Cajv=a[j]-a[j+u];a[j]=a[j]+a[j+u];a[j+u]=ajv;}}}staticvoidfft_real(vector<C>&AL,vector<C>&AH,intk){fft(AL,k);AH[0]=C{AL[0].y*2.0,0};AL[0]=C{AL[0].x*2.0,0};AH[1]=C{AL[1].y*2.0,0};AL[1]=C{AL[1].x*2.0,0};for(inti=2,y=2;y<(1<<k);y<<=1){for(;i<2*y;i+=2){intj=i^(y-1);AH[i]=(AL[j].conj()-AL[i]).rotl();AL[i]=(AL[j].conj()+AL[i]);AH[j]=AH[i].conj();AL[j]=AL[i].conj();}}}// naive convolution for inttemplate<typenameT,enable_if_t<is_integral<T>::value,nullptr_t>=nullptr>staticvector<longlong>multiply(constvector<T>&s,constvector<T>&t){intl=s.size()+t.size()-1;if(min(s.size(),t.size())<=40){vector<longlong>u(l);for(inti=0;i<(int)s.size();i++){for(intj=0;j<(int)t.size();j++)u[i+j]+=1LL*s[i]*t[j];}returnu;}intk=2,M=4;while(M<l)M<<=1,++k;setw(k);autoround=[](doublex)->longlong{return(longlong)(x+(x>0?0.5:-0.5));};vector<C>a(M);for(inti=0;i<(int)s.size();i++)a[i].x=s[i];for(inti=0;i<(int)t.size();i++)a[i].y=t[i];fft(a,k);a[0].y=4.0*a[0].x*a[0].y;a[1].y=4.0*a[1].x*a[1].y;a[0].x=a[1].x=0.0;for(inti=2;i<M;i+=2){intc=1<<(31-__builtin_clz(i));intj=i^(c-1);a[i]=(a[i]+a[j].conj())*(a[i]-a[j].conj());a[j]=-a[i].conj();}vector<C>b(M/2);for(intj=0;j<M/2;j++){Ctmp1=a[j*2+0]+a[j*2+1];Ctmp2=(a[j*2+0]-a[j*2+1])*w[j].conj();b[j]=tmp1+tmp2.rotl();}ifft(b,k-1);vector<longlong>u(l);for(inti=0;i<l;i++){if(i&1){u[i]=round(-b[i>>1].x/(4.0*M));}else{u[i]=round(b[i>>1].y/(4.0*M));}}returnu;}staticvector<double>multiply(constvector<double>&s,constvector<double>&t){intl=s.size()+t.size()-1;if(min(s.size(),t.size())<=40){vector<double>u(l);for(inti=0;i<(int)s.size();i++){for(intj=0;j<(int)t.size();j++)u[i+j]+=s[i]*t[j];}returnu;}intk=2,M=4;while(M<l)M<<=1,++k;setw(k);vector<C>a(M);for(inti=0;i<(int)s.size();i++)a[i].x=s[i];for(inti=0;i<(int)t.size();i++)a[i].y=t[i];fft(a,k);a[0].y=4.0*a[0].x*a[0].y;a[1].y=4.0*a[1].x*a[1].y;a[0].x=a[1].x=0.0;for(inti=2;i<M;i+=2){intc=1<<(31-__builtin_clz(i));intj=i^(c-1);a[i]=(a[i]+a[j].conj())*(a[i]-a[j].conj());a[j]=-a[i].conj();}vector<C>b(M/2);for(intj=0;j<M/2;j++){Ctmp1=a[j*2+0]+a[j*2+1];Ctmp2=(a[j*2+0]-a[j*2+1])*w[j].conj();b[j]=tmp1+tmp2.rotl();}ifft(b,k-1);vector<double>u(l);for(inti=0;i<l;i++){if(i&1){u[i]=-b[i>>1].x/(4.0*M);}else{u[i]=b[i>>1].y/(4.0*M);}}returnu;}template<unsignedintMOD=-1u>staticconditional_t<MOD==-1u,vector<__uint128_t>,vector<int>>multiply_15bit(constvector<int>&a,constvector<int>&b){usingu64=unsignedlonglong;constexpru64B=32000;intl=a.size()+b.size()-1;intk=2,M=4;while(M<l)M<<=1,++k;setw(k);autoround=[](doublex)->u64{returnu64(x+0.5);};vector<C>AL(M),AH(M),BL(M),BH(M);for(inti=0;i<(int)a.size();i++){AL[i]=C{double(a[i]%B),double(a[i]/B)};}for(inti=0;i<(int)b.size();i++){BL[i]=C{double(b[i]%B),double(b[i]/B)};}fft_real(AL,AH,k);fft_real(BL,BH,k);for(inti=0;i<M;i++){Ctmp=AL[i]*BL[i]+(AH[i]*BH[i]).rotl();BH[i]=AL[i]*BH[i]+(AH[i]*BL[i]).rotl();BL[i]=tmp;}ifft(BL,k);ifft(BH,k);usingreturn_type=conditional_t<MOD+1u==0u,vector<__uint128_t>,vector<int>>;return_typeu(l);doubleim=1.0/(4.0*M);for(inti=0;i<l;i++){BL[i].x*=im,BL[i].y*=im;BH[i].x*=im,BH[i].y*=im;u64s1=round(BL[i].x);u64s2=round(BH[i].x)+round(BH[i].y);u64s3=round(BL[i].y);ifconstexpr(MOD==-1u){u[i]+=__uint128_t(s1);u[i]+=__uint128_t(s2)*B;u[i]+=__uint128_t(s3)*B*B;}else{u[i]+=s1%MOD;u[i]+=s2%MOD*B%MOD;if(u[i]>=MOD)u[i]-=MOD;u[i]+=s3%MOD*(B*B%MOD)%MOD;if(u[i]>=MOD)u[i]-=MOD;}}returnu;}};vector<C>CooleyTukey::w;}// namespace ArbitraryModConvolution#line 7 "verify/verify-yosupo-ntt/yosupo-convolution-real-fft-toom-3.test.cpp"
namespaceArbitraryModConvolution{// naive Toom-3template<unsignedintMOD>vector<int>toom_3(constvector<int>&a,constvector<int>&b){autoprecalc=[](constvector<int>&_a)->array<vector<int>,5>{intn=_a.size();vector<int>p0(n),p1(n),pm1(n),pm2(n),pinf(n);for(inti=0;i<n;i++){intm0=_a[i]&1023;intm1=(_a[i]>>10)&1023;intm2=(_a[i]>>20)&1023;p0[i]=m0;p1[i]=m0+m1+m2;pm1[i]=m0-m1+m2;pm2[i]=m0-2*m1+4*m2;pinf[i]=m2;}return{{p0,p1,pm1,pm2,pinf}};};auto[a0,a1,am1,am2,ainf]=precalc(a);auto[b0,b1,bm1,bm2,binf]=precalc(b);autoc0=CooleyTukey::multiply(a0,b0);autoc1=CooleyTukey::multiply(a1,b1);autocm1=CooleyTukey::multiply(am1,bm1);autocm2=CooleyTukey::multiply(am2,bm2);autocinf=CooleyTukey::multiply(ainf,binf);vector<int>c(c0.size());for(inti=0;i<(int)c.size();i++){longlongr0=c0[i];longlongr4=cinf[i];longlongr3=(cm2[i]-c1[i])/3;longlongr1=(c1[i]-cm1[i])/2;longlongr2=cm1[i]-c0[i];r3=(r2-r3)/2+r4*2;r2+=r1-r4;r1-=r3;longlongret=r4%MOD*1048576;ret+=r3%MOD*1024+r2;ret=ret%MOD*1048576;ret+=r1%MOD*1024+r0;ret%=MOD;if(ret<0)ret+=MOD;c[i]=ret;}returnc;}}// namespace ArbitraryModConvolutionvoidNyaan::solve(){usingnamespaceArbitraryModConvolution;intN,M;rd(N,M);vector<int>a(N),b(M);for(auto&x:a)rd(x);for(auto&x:b)rd(x);autoc=toom_3<1000000007>(a,b);// auto c = CooleyTukey::karatsuba<1000000007>(a, b);for(inti=0;i<N+M-1;i++){wt(c[i]," \n"[i==N+M-2]);}}