#define PROBLEM "https://judge.yosupo.jp/problem/polynomial_composite_set_power_series"
#include"template/template.hpp"
#include"modint/modint.hpp"usingmint=ModInt<998244353>;#include"set/composite-set-power-series.hpp"intmain(){intm,n;in(m,n);vector<mint>a(m),b(1<<n);in(a,b);autoc=SetPowerSeries::composite_polynomial(a,b);out(c);}
#line 1 "verify/set/LC_polynomial_composite_set_power_series.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/polynomial_composite_set_power_series"
#line 2 "template/template.hpp"
#include<bits/stdc++.h>usingnamespacestd;#line 2 "template/macro.hpp"
#define rep(i, a, b) for (int i = (a); i < (int)(b); i++)
#define rrep(i, a, b) for (int i = (int)(b) - 1; i >= (a); i--)
#define ALL(v) (v).begin(), (v).end()
#define UNIQUE(v) sort(ALL(v)), (v).erase(unique(ALL(v)), (v).end())
#define SZ(v) (int)v.size()
#define MIN(v) *min_element(ALL(v))
#define MAX(v) *max_element(ALL(v))
#define LB(v, x) int(lower_bound(ALL(v), (x)) - (v).begin())
#define UB(v, x) int(upper_bound(ALL(v), (x)) - (v).begin())
#define YN(b) cout << ((b) ? "YES" : "NO") << "\n";
#define Yn(b) cout << ((b) ? "Yes" : "No") << "\n";
#define yn(b) cout << ((b) ? "yes" : "no") << "\n";
#line 6 "template/template.hpp"
#line 2 "template/util.hpp"
usinguint=unsignedint;usingll=longlongint;usingull=unsignedlonglong;usingi128=__int128_t;usingu128=__uint128_t;template<classT,classS=T>SSUM(constvector<T>&a){returnaccumulate(ALL(a),S(0));}template<classT>inlineboolchmin(T&a,Tb){if(a>b){a=b;returntrue;}returnfalse;}template<classT>inlineboolchmax(T&a,Tb){if(a<b){a=b;returntrue;}returnfalse;}template<classT>intpopcnt(Tx){return__builtin_popcountll(x);}template<classT>inttopbit(Tx){return(x==0?-1:63-__builtin_clzll(x));}template<classT>intlowbit(Tx){return(x==0?-1:__builtin_ctzll(x));}#line 8 "template/template.hpp"
#line 2 "template/inout.hpp"
structFast{Fast(){cin.tie(nullptr);ios_base::sync_with_stdio(false);cout<<fixed<<setprecision(15);}}fast;template<classT1,classT2>istream&operator>>(istream&is,pair<T1,T2>&p){returnis>>p.first>>p.second;}template<classT1,classT2>ostream&operator<<(ostream&os,constpair<T1,T2>&p){returnos<<p.first<<" "<<p.second;}template<classT>istream&operator>>(istream&is,vector<T>&a){for(auto&v:a)is>>v;returnis;}template<classT>ostream&operator<<(ostream&os,constvector<T>&a){for(autoit=a.begin();it!=a.end();){os<<*it;if(++it!=a.end())os<<" ";}returnos;}template<classT>ostream&operator<<(ostream&os,constset<T>&st){os<<"{";for(autoit=st.begin();it!=st.end();){os<<*it;if(++it!=st.end())os<<",";}os<<"}";returnos;}template<classT1,classT2>ostream&operator<<(ostream&os,constmap<T1,T2>&mp){os<<"{";for(autoit=mp.begin();it!=mp.end();){os<<it->first<<":"<<it->second;if(++it!=mp.end())os<<",";}os<<"}";returnos;}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...);}#line 10 "template/template.hpp"
#line 2 "template/debug.hpp"
#ifdef LOCAL
#define debug 1
#define show(...) _show(0, #__VA_ARGS__, __VA_ARGS__)
#else
#define debug 0
#define show(...) true
#endif
template<classT>void_show(inti,Tname){cerr<<'\n';}template<classT1,classT2,class...T3>void_show(inti,constT1&a,constT2&b,constT3&...c){for(;a[i]!=','&&a[i]!='\0';i++)cerr<<a[i];cerr<<":"<<b<<" ";_show(i+1,a,c...);}#line 2 "modint/modint.hpp"
template<unsignedintm=998244353>structModInt{usingmint=ModInt;unsignedint_v;staticconstexprunsignedintget_mod(){returnm;}staticmintraw(intv){mintx;x._v=v;returnx;}ModInt():_v(0){}ModInt(int64_tv){longlongx=(longlong)(v%(longlong)(umod()));if(x<0)x+=umod();_v=(unsignedint)(x);}unsignedintval()const{return_v;}mint&operator++(){_v++;if(_v==umod())_v=0;return*this;}mint&operator--(){if(_v==0)_v=umod();_v--;return*this;}mintoperator++(int){mintresult=*this;++*this;returnresult;}mintoperator--(int){mintresult=*this;--*this;returnresult;}mint&operator+=(constmint&rhs){_v+=rhs._v;if(_v>=umod())_v-=umod();return*this;}mint&operator-=(constmint&rhs){_v-=rhs._v;if(_v>=umod())_v+=umod();return*this;}mint&operator*=(constmint&rhs){unsignedlonglongz=_v;z*=rhs._v;_v=(unsignedint)(z%umod());return*this;}mint&operator/=(constmint&rhs){return*this=*this*rhs.inv();}mintoperator+()const{return*this;}mintoperator-()const{returnmint()-*this;}mintpow(longlongn)const{assert(0<=n);mintx=*this,r=1;while(n){if(n&1)r*=x;x*=x;n>>=1;}returnr;}mintinv()const{assert(_v);returnpow(umod()-2);}friendmintoperator+(constmint&lhs,constmint&rhs){returnmint(lhs)+=rhs;}friendmintoperator-(constmint&lhs,constmint&rhs){returnmint(lhs)-=rhs;}friendmintoperator*(constmint&lhs,constmint&rhs){returnmint(lhs)*=rhs;}friendmintoperator/(constmint&lhs,constmint&rhs){returnmint(lhs)/=rhs;}friendbooloperator==(constmint&lhs,constmint&rhs){returnlhs._v==rhs._v;}friendbooloperator!=(constmint&lhs,constmint&rhs){returnlhs._v!=rhs._v;}friendistream&operator>>(istream&is,mint&x){returnis>>x._v;}friendostream&operator<<(ostream&os,constmint&x){returnos<<x.val();}private:staticconstexprunsignedintumod(){returnm;}};#line 5 "verify/set/LC_polynomial_composite_set_power_series.test.cpp"
usingmint=ModInt<998244353>;#line 2 "set/subset-convolution.hpp"
template<classmint,intn_>structSubsetConvolution{staticconstexprintn=n_;usingpoly=array<mint,n_+1>;vector<int>pc;SubsetConvolution(){pc.assign(1<<n,0);for(inti=1;i<pc.size();i++)pc[i]=pc[i>>1]+(i&1);}voidpoly_add(poly&p,constpoly&q,intd){for(inti=0;i<d;i++)p[i]+=q[i];}voidpoly_sub(poly&p,constpoly&q,intd){for(inti=d;i<=n;i++)p[i]-=q[i];}voidpoly_mul(poly&p,constpoly&q){polyr{};for(inti=0;i<=n;i++)for(intj=0;j<=n-i;j++)r[i+j]+=p[i]*q[j];swap(p,r);}vector<poly>lift(constvector<mint>&a){intn=a.size();assert(n==(n&-n));vector<poly>b(n);for(inti=0;i<n;i++){b[i].fill(0);b[i][pc[i]]=a[i];}returnb;}vector<mint>unlift(constvector<poly>&b){intn=b.size();assert(n==(n&-n));vector<mint>a(n);for(inti=0;i<n;i++)a[i]=b[i][pc[i]];returna;}voidranked_zeta(vector<poly>&a){intn=a.size();for(inti=1;i<n;i<<=1)for(intj=0;j<n;j+=i*2)for(intk=0;k<i;k++)poly_add(a[i+j+k],a[j+k],pc[i+j+k]);}voidranked_mobius(vector<poly>&a){intn=a.size();for(inti=1;i<n;i<<=1)for(intj=0;j<n;j+=i*2)for(intk=0;k<i;k++)poly_sub(a[i+j+k],a[j+k],pc[i+j+k]);}voidranked_mul(vector<poly>&a,constvector<poly>&b){for(inti=0;i<a.size();i++)poly_mul(a[i],b[i]);}vector<mint>multiply(constvector<mint>&a,constvector<mint>&b){autop=lift(a);autoq=lift(b);ranked_zeta(p);ranked_zeta(q);ranked_mul(p,q);ranked_mobius(p);returnunlift(p);}};/**
* @brief Subset Convolution
* @docs docs/set/subset-convolution.md
*/#line 3 "set/composite-set-power-series.hpp"
namespaceSetPowerSeries{template<classmint,intsz=21>vector<mint>composite_egf(vector<mint>f,vector<mint>a){staticSubsetConvolution<mint,sz>sc;assert(a[0]==0);if(f.empty())returnvector<mint>(a.size());intl=__builtin_ctz(a.size());f.resize(l+1);vector<vector<mint>>g(l+1);for(inti=0;i<=l;i++)g[i]=vector<mint>(1<<(l-i),0);for(inti=0;i<=l;i++)g[i][0]=f[i];for(intk=0;k<l;k++){autop=sc.lift(vector<mint>(a.begin()+(1<<k),a.begin()+(2<<k)));sc.ranked_zeta(p);for(inti=0;i<l-k;i++){autoq=sc.lift(vector<mint>(g[i+1].begin(),g[i+1].begin()+(1<<k)));sc.ranked_zeta(q);sc.ranked_mul(q,p);sc.ranked_mobius(q);autoh=sc.unlift(q);copy(h.begin(),h.end(),g[i].begin()+(1<<k));}}returng[0];}template<classmint,intsz=21>vector<mint>composite_polynomial(vector<mint>p,vector<mint>a){if(p.empty())returnvector<mint>(a.size());intl=__builtin_ctz(a.size());if(a[0]!=0){mintc=a[0];a[0]=0;vector<mint>p1(l+1,0),binom(l+1,0);binom[0]=1;for(inti=0;i<p.size();i++){mintr=i<=l?1:c.pow(i-l);for(intj=min(i,l);j>=0;j--,r*=c)p1[j]+=p[i]*binom[j]*r;for(intj=l;j>0;j--)binom[j]+=binom[j-1];}swap(p,p1);}mintr=1;for(inti=1;i<=l;i++)p[i]*=(r*=i);returncomposite_egf<mint,sz>(p,a);}// log(a), [x^0]a=1// require inverse of 1,...,sztemplate<classmint,intsz=21>vector<mint>log(vector<mint>a){staticSubsetConvolution<mint,sz>sc;assert(a[0]==1);intl=__builtin_ctz(a.size());if(l==0)return{0};vector<mint>inv(l+1,1);rep(i,1,l+1)inv[i]=mint(i).inv();autop=sc.lift(a);sc.ranked_zeta(p);for(intk=0;k<p.size();k++){autoq=p[k];p[k][0]=0;for(inti=1;i<=l;i++){mintv=i*q[i];for(intj=1;j<i;j++)v-=j*p[k][j]*q[i-j];p[k][i]=v*inv[i];}}sc.ranked_mobius(p);returnsc.unlift(p);}// log(a), [x^0]a=1// not require inverse of 1,...,sztemplate<classmint,intsz=21>vector<mint>log_arbitrary(vector<mint>a){assert(a[0]==1);intl=__builtin_ctz(a.size());if(l==0)return{0};a[0]=0;vector<mint>f(l+1,0);f[1]=1;for(inti=2;i<=l;i++)f[i]=f[i-1]*(1-i);returncomposite_egf<mint,sz>(f,a);}// a^m, [x^0]a=1// require inverse of 1,...,sztemplate<classmint,intsz=21>vector<mint>pow(vector<mint>a,mintm){staticSubsetConvolution<mint,sz>sc;assert(a[0]==1);intl=__builtin_ctz(a.size());if(l==0)return{1};vector<mint>inv(l+1,1);rep(i,1,l+1)inv[i]=mint(i).inv();autop=sc.lift(a);sc.ranked_zeta(p);for(intk=0;k<p.size();k++){autoq=p[k];p[k][0]=1;for(inti=1;i<=l;i++){mintv=0;for(intj=1;j<i;j++)v+=(m*j-(i-j))*p[k][i-j]*q[j];v*=inv[i];v+=m*p[k][0]*q[i];p[k][i]=v;}}sc.ranked_mobius(p);returnsc.unlift(p);}// a^m, [x^0]a=1// not require inverse of 1,...,sztemplate<classmint,intsz=21>vector<mint>pow_arbitrary(vector<mint>a,mintm){assert(a[0]==1);intl=__builtin_ctz(a.size());if(l==0)return{1};a[0]=0;vector<mint>f(l+1,0);f[0]=1;for(inti=1;i<=l;i++){f[i]=f[i-1]*m;m-=1;}returncomposite_egf<mint,sz>(f,a);}};// namespace SetPowerSeries/**
* @brief Polynomial Composite Set Power Series
* @docs docs/set/composite-set-power-series.md
*/#line 7 "verify/set/LC_polynomial_composite_set_power_series.test.cpp"
intmain(){intm,n;in(m,n);vector<mint>a(m),b(1<<n);in(a,b);autoc=SetPowerSeries::composite_polynomial(a,b);out(c);}