#include using namespace std; #define LOCAL #pragma region Macros typedef long long ll; #define ALL(x) (x).begin(),(x).end() const long long MOD=1000000007; // const long long MOD=998244353; const int INF=1e9; const long long IINF=1e18; const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1}; const char dir[4]={'D','R','U','L'}; template istream &operator>>(istream &is,vector &v){ for (T &x:v) is >> x; return is; } template ostream &operator<<(ostream &os,const vector &v){ for (int i=0;i ostream &operator<<(ostream &os,const pair &p){ os << '(' << p.first << ',' << p.second << ')'; return os; } template ostream &operator<<(ostream &os,const map &m){ os << '{'; for (auto itr=m.begin();itr!=m.end();++itr){ os << '(' << itr->first << ',' << itr->second << ')'; if (++itr!=m.end()) os << ','; --itr; } os << '}'; return os; } template ostream &operator<<(ostream &os,const set &s){ os << '{'; for (auto itr=s.begin();itr!=s.end();++itr){ os << *itr; if (++itr!=s.end()) os << ','; --itr; } os << '}'; return os; } void debug_out(){cerr << '\n';} template void debug_out(Head&& head,Tail&&... tail){ cerr << head; if (sizeof...(Tail)>0) cerr << ", "; debug_out(move(tail)...); } #ifdef LOCAL #define debug(...) cerr << " ";\ cerr << #__VA_ARGS__ << " :[" << __LINE__ << ":" << __FUNCTION__ << "]" << '\n';\ cerr << " ";\ debug_out(__VA_ARGS__) #else #define debug(...) 42 #endif template T gcd(T x,T y){return y!=0?gcd(y,x%y):x;} template T lcm(T x,T y){return x/gcd(x,y)*y;} template inline bool chmin(T1 &a,T2 b){ if (a>b){a=b; return true;} return false; } template inline bool chmax(T1 &a,T2 b){ if (a class modint{ using u64=uint_fast64_t; public: u64 a; constexpr modint(const u64 x=0) noexcept:a(x%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; } }; 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; int main(){ cin.tie(0); ios::sync_with_stdio(false); int N,Q; cin >> N >> Q; vector> A(N,vector(2)); NumberTheoreticTransform<998244353> NTT; for (int i=0;i> a; --a; A[i][0]=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'; } }