#pragma once
#define REP_(i, n) for (int i = 0; i < (n); i++)
#define RREP_(i, n) for (int i = (n)-1; i >= 0; i--)
template<typenameMINT>std::vector<MINT>convolution(std::vector<MINT>f,std::vector<MINT>g){intnf=f.size(),ng=g.size();if(!nfor!ng)returnstd::vector<MINT>{};intM=nf+ng-1;if(nf<=60orng<=60){std::vector<MINT>res(M,0);REP_(i,nf)REP_(j,ng)res[i+j]+=f[i]*g[j];returnres;}intlg;for(lg=0;(1<<lg)<M;lg++){}constintN=1<<lg;f.resize(N,0);g.resize(N,0);static_assert(MINT::mod==998244353);MINTc=MINT(3).pow((MINT::mod-1)>>lg);std::vector<MINT>cs(N);REP_(i,N)cs[i]=(i?cs[i-1]*c:1);std::vector<int>x(N,0);REP_(h,lg)REP_(S,1<<h)REP_(T,1<<(lg-h-1)){intl=(S<<(lg-h))|T;intr=l|(1<<(lg-h-1));x[l]>>=1;(x[r]>>=1)|=1<<(lg-1);MINTa=f[l];f[l]+=f[r]*cs[x[l]];(f[r]*=cs[x[r]])+=a;a=g[l];g[l]+=g[r]*cs[x[l]];(g[r]*=cs[x[r]])+=a;}REP_(i,N)f[i]*=g[i];std::ranges::fill(x,0);c=c.inv();REP_(i,N)cs[i]=(i?cs[i-1]*c:1);RREP_(h,lg)REP_(S,1<<h)REP_(T,1<<(lg-h-1)){intl=(S<<(lg-h))|T;intr=l|(1<<(lg-h-1));x[l]>>=1;(x[r]>>=1)|=1<<(lg-1);MINTa=f[l];f[l]+=f[r]*cs[x[l]];(f[r]*=cs[x[r]])+=a;}f.resize(M);MINTNinv=MINT(N).inv();REP_(i,M)f[i]*=Ninv;returnf;}#undef REP_
#undef RREP_
#line 2 "library/convolution/NTT.hpp"
#define REP_(i, n) for (int i = 0; i < (n); i++)
#define RREP_(i, n) for (int i = (n)-1; i >= 0; i--)
template<typenameMINT>std::vector<MINT>convolution(std::vector<MINT>f,std::vector<MINT>g){intnf=f.size(),ng=g.size();if(!nfor!ng)returnstd::vector<MINT>{};intM=nf+ng-1;if(nf<=60orng<=60){std::vector<MINT>res(M,0);REP_(i,nf)REP_(j,ng)res[i+j]+=f[i]*g[j];returnres;}intlg;for(lg=0;(1<<lg)<M;lg++){}constintN=1<<lg;f.resize(N,0);g.resize(N,0);static_assert(MINT::mod==998244353);MINTc=MINT(3).pow((MINT::mod-1)>>lg);std::vector<MINT>cs(N);REP_(i,N)cs[i]=(i?cs[i-1]*c:1);std::vector<int>x(N,0);REP_(h,lg)REP_(S,1<<h)REP_(T,1<<(lg-h-1)){intl=(S<<(lg-h))|T;intr=l|(1<<(lg-h-1));x[l]>>=1;(x[r]>>=1)|=1<<(lg-1);MINTa=f[l];f[l]+=f[r]*cs[x[l]];(f[r]*=cs[x[r]])+=a;a=g[l];g[l]+=g[r]*cs[x[l]];(g[r]*=cs[x[r]])+=a;}REP_(i,N)f[i]*=g[i];std::ranges::fill(x,0);c=c.inv();REP_(i,N)cs[i]=(i?cs[i-1]*c:1);RREP_(h,lg)REP_(S,1<<h)REP_(T,1<<(lg-h-1)){intl=(S<<(lg-h))|T;intr=l|(1<<(lg-h-1));x[l]>>=1;(x[r]>>=1)|=1<<(lg-1);MINTa=f[l];f[l]+=f[r]*cs[x[l]];(f[r]*=cs[x[r]])+=a;}f.resize(M);MINTNinv=MINT(N).inv();REP_(i,M)f[i]*=Ninv;returnf;}#undef REP_
#undef RREP_