#include using namespace std; const long long MOD=998244353; template class modint{ using u64=uint_fast64_t; public: u64 a; constexpr modint(const u64 x=0) noexcept:a(((x%Modulus)+Modulus)%Modulus){} constexpr u64 &value() noexcept{return a;} constexpr const u64 &value() const noexcept{return a;} constexpr modint &operator+=(const modint &rhs) noexcept{ a+=rhs.a; if (a>=Modulus) a-=Modulus; return *this; } constexpr modint operator+(const modint &rhs) const noexcept{ return modint(*this)+=rhs; } constexpr modint &operator++() noexcept{ return ++a,*this; } constexpr modint operator++(int) noexcept{ modint t=*this; return ++a,t; } constexpr modint &operator-=(const modint &rhs) noexcept{ if (a>=1; } return *this; } constexpr modint operator/(const modint &rhs) const noexcept{ return modint(*this)/=rhs; } constexpr modint operator-() const noexcept{ return modint(Modulus-a); } constexpr bool operator==(const modint &rhs) const noexcept{ return a==rhs.a; } constexpr bool operator!=(const modint &rhs) const noexcept{ return a!=rhs.a; } constexpr bool operator!() const noexcept{return !a;} friend constexpr modint pow(modint rhs,long long exp) noexcept{ modint res{1}; while(exp){ if (exp&1) res*=rhs; rhs*=rhs; exp>>=1; } return res; } template friend constexpr modint operator+(T x,modint y) noexcept{ return modint(x)+y; } template friend constexpr modint operator-(T x,modint y) noexcept{ return modint(x)-y; } template friend constexpr modint operator*(T x,modint y) noexcept{ return modint(x)*y; } template friend constexpr modint operator/(T x,modint y) noexcept{ return modint(x)/y; } friend ostream &operator<<(ostream &s,const modint &rhs) noexcept{ return s << rhs.a; } friend istream &operator>>(istream &s,modint &rhs) noexcept{ u64 a; rhs=modint{(s >> a,a)}; return s; } }; using mint=modint; template struct NumberTheoreticTransform{ using Mint=modint; vector roots; vector rev; int base,max_base; Mint root; NumberTheoreticTransform():base(1),rev{0,1},roots{Mint(0),Mint(1)}{ int tmp=mod-1; for (max_base=0;tmp%2==0;++max_base) tmp>>=1; root=2; while(pow(root,(mod-1)>>1)==1) ++root; root=pow(root,(mod-1)>>max_base); } void ensure_base(int nbase){ if (nbase<=base) return; rev.resize(1<>1]>>1)|((i&1)<<(nbase-1)); } roots.resize(1< &a){ const int n=a.size(); int zeros=__builtin_ctz(n); ensure_base(zeros); int shift=base-zeros; for (int i=0;i>shift)){ swap(a[i],a[rev[i]>>shift]); } } for (int k=1;k multiply(vector a,vector b){ int need=a.size()+b.size()-1; int nbase=1; while((1< multiply(vector a,vector b){ vector A(a.size()),B(b.size()); for (int i=0;i C=multiply(A,B); vector res(C.size()); for (int i=0;i> N >> Q; vector> A(N,vector(2)); NumberTheoreticTransform NTT; for (int i=0;i> a; --a; A[i][0]=(mint)a,A[i][1]=1; } auto dfs=[&](auto self,int l,int r)->vector{ if (r-l==1) return A[l]; int mid=(l+r)>>1; return NTT.multiply(self(self,l,mid),self(self,mid,r)); }; vector dp=dfs(dfs,0,N); for (;Q--;){ int B; cin >> B; cout << dp[B] << '\n'; } }