#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define X first #define Y second #define pb push_back #define rep(X,Y) for (int (X) = 0;(X) < (int)(Y);++(X)) #define reps(X,S,Y) for (int (X) = (int)(S);(X) < (int)(Y);++(X)) #define rrep(X,Y) for (int (X) = (int)(Y)-1;(X) >=0;--(X)) #define rreps(X,S,Y) for (int (X) = (int)(Y)-1;(X) >= (int)(S);--(X)) #define repe(X,Y) for ((X) = 0;(X) < (Y);++(X)) #define peat(X,Y) for (;(X) < (Y);++(X)) #define all(X) (X).begin(),(X).end() #define rall(X) (X).rbegin(),(X).rend() #define eb emplace_back #define UNIQUE(X) (X).erase(unique(all(X)),(X).end()) #define Endl endl #define NL <<"\n" #define cauto const auto using namespace std; using ll=long long; using pii=pair; using pll=pair; template using vv=vector>; template inline bool MX(T &l,const T &r){return l inline bool MN(T &l,const T &r){return l>r?l=r,1:0;} //#undef NUIP #ifdef NUIP #include "benri.h" #else #define out(args...) #endif void ouT(ll x,int d=3){auto re=to_string(x);if((int)re.size()>d) re=x>0?"oo":"-oo";cout<vector table(int n, T v){ return vector(n, v);} template auto table(int n, Args... args){auto val = table(args...); return vector(n, move(val));} #endif template pair operator+(const pair &p,const pair &q){ return {p.X+q.X,p.Y+q.Y};} template pair& operator+=(pair &p,const pair &q){ p.X+=q.X; p.Y+=q.Y; return p;} template pair operator-(const pair &p,const pair &q){ return {p.X-q.X,p.Y-q.Y};} template pair& operator-=(pair &p,const pair &q){ p.X-=q.X; p.Y-=q.Y; return p;} template istream& operator>>(istream &is, pair &p){ is>>p.X>>p.Y; return is;} template T read(){ T re; cin>>re; return re;} template T read(const T &dec){ T re; cin>>re; return re-dec;} template vector readV(const int sz){ vector re(sz); for(auto &x:re) x=read(); return re;} template vector readV(const int sz, const T &dec){ vector re(sz); for(auto &x:re) x=read(dec); return re;} vv readG(const int &n,const int &m){ vv g(n); rep(_,m){ cauto a=read(1),b=read(1); g[a].pb(b); g[b].pb(a);} return g;} vv readG(const int &n){ return readG(n,n-1);} vv readD(const int &n,const int &m){ vv g(n); rep(_,m){ cauto a=read(1),b=read(1); g[a].pb(b); } return g;} vv readD(const int &n){ return readD(n,n-1);} template vv> readG(const int &n,const int &m){ vv> g(n); rep(_,m){ cauto a=read(1),b=read(1); cauto c=read(); g[a].eb(b,c); g[b].eb(a,c);} return g;} template vv> readG(const int &n){ return readG(n,n-1);} template vv> readD(const int &n,const int &m){ vv> g(n); rep(_,m){ cauto a=read(1),b=read(1); cauto c=read(); g[a].eb(b,c); } return g;} template vv> readD(const int &n){ return readD(n,n-1);} #ifdef __cpp_init_captures template vector readT(int n, T v){ return readV(n,v);} template auto readT(int n, Args... args){ vector re(1,readT(args...));rep(_,n-1) re.eb(readT(args...)); return re;} template void addadd(T& t1, const T& t2, integer_sequence){ cauto l = { (get(t1) += get(t2), 0)... }; (void)l;} template tuple& operator += (tuple& lhs, const tuple& rhs){ addadd(lhs, rhs, index_sequence_for{}); return lhs;} template tuple operator +(tuple lhs, const tuple& rhs){ return lhs += rhs;} template void subsub(T& t1, const T& t2, integer_sequence){ cauto l = { (get(t1) -= get(t2), 0)... }; (void)l;} template tuple& operator -= (tuple& lhs, const tuple& rhs){ subsub(lhs, rhs, index_sequence_for{}); return lhs;} template tuple operator - (tuple lhs, const tuple& rhs){ return lhs -= rhs;} template void read_tuple_impl(istream &is, Tuple& t, index_sequence){((is >> get(t)), ...);} template auto& operator>>(istream &is, tuple& t){ read_tuple_impl(is, t, index_sequence_for{}); return is;} #endif #define TT cauto TTT=read();rep(_,TTT) const ll MOD=998244353; ll modpow_(ll r,ll n,ll m=MOD){ ll re=1,d=r%m; if(n<0)(n%=m-1)+=m-1; for(;n;n/=2){ if(n&1)(re*=d)%=m; (d*=d)%=m; } return re; } template struct ModInt{ int v; ModInt(int v=0):v(v){} ModInt operator+(const ModInt &n)const{return v+n.v=mod) v-=mod; return *this;} ModInt& operator-=(const ModInt &n){v-=n.v; if(v<0) v+=mod; return *this;} ModInt& operator*=(const ModInt &n){v=ll(v)*n.v%mod; return *this;} ModInt& operator/=(const ModInt &n){v=ll(v)*modpow_(n.v,-1,mod)%mod; return *this;} ModInt& operator+=(const ll &n){v+=n; if(v>=mod) v-=mod; return *this;} ModInt& operator-=(const ll &n){v-=n; if(v<0) v+=mod; return *this;} ModInt& operator*=(const ll &n){v=ll(v)*n%mod; return *this;} ModInt& operator/=(const ll &n){v=ll(v)*modpow_(n,-1,mod)%mod; return *this;} bool operator==(const ModInt &n)const{return v==n.v;}; bool operator!=(const ModInt &n)const{return v!=n.v;}; ModInt& operator++(){ return operator+=(1); } ModInt& operator--(){ return operator-=(1); } ModInt operator++(int i){ ModInt tmp(*this); operator++(); return tmp; } ModInt operator--(int i){ ModInt tmp(*this); operator--(); return tmp; } }; #ifdef NUIP class MINT_FRAC____{ public: unordered_map dict; MINT_FRAC____(int n){ rep(p,n+1)reps(q,1,n+1)if(__gcd(p,q)==1){ dict[1ll*p*modpow_(q,-1)%MOD]=pii(p,q); dict[MOD-1ll*p*modpow_(q,-1)%MOD]=pii(-p,q); } } } Il1Il1Il1(1000); template ostream& operator<<(ostream &os,const ModInt &n){if(Il1Il1Il1.dict.count(n.v)) os< ostream& operator<<(ostream &os,const ModInt &n){return os< ModInt operator+(const ll &n,const ModInt &m){return m.v+n ModInt operator-(const ll &n,const ModInt &m){return n-m.v<0 ? n-m.v+mod : n-m.v;} template ModInt operator*(const ll &n,const ModInt &m){return ll(m.v)*(n%mod)%mod;} template ModInt operator/(const ll &n,const ModInt &m){return ModInt(n%mod)/m;} typedef ModInt mint; template ModInt modpow(ModInt r,ll n){ ModInt re(1); if(n<0)(n%=mod-1)+=mod-1; for(;n;n/=2){if(n&1) re*=r; r*=r;} return re;} vector fact,finv,inv; mint comb(ll n,ll r){ if(n &re,int n){ re.resize(n+1); re[1]=1; for(int i=2;i<=n;++i)re[i]=re[MOD%i]*(MOD-MOD/i);} void Facts(vector &re,int n){ re.resize(n+1); re[0]=1; rep(i,n)re[i+1]=re[i]*(i+1);} void Factinvs(vector &re,const vector &inv,int n){ re.resize(n+1); re[0]=1; rep(i,n)re[i+1]=re[i]*inv[i+1];} public: Doralion(int n){ Modinvs(inv,n); Facts(fact,n); Factinvs(finv,inv,n);} } doralion(1123456); using pmm=pair; mint modpow(ll r,ll n){ return modpow_(r,n);} int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout< sums(n+1); rep(i,n) sums[i+1]=sums[i]+vs[i]; map dp{{0,1}}; out(dp,1); rrep(i,n){ cauto &v=vs[i]; cauto cur=dp; dp.clear(); for(cauto &[s,cnt]:cur){ if((sums[i+1]+s)/2==v){ dp[(s+1)/2]+=cnt; rep(dec,MOD){ if(v-dec<-t) break; if(v-dec>t) continue; dp[s+dec]+=cnt; } }else if((sums[i+1]+s)/2>v){ if(s==sums[i]+v) dp[s-v]+=cnt; }else{ dp[max(s,v)]+=cnt; } } } mint re=0; for(cauto &p:dp) re+=p.Y; cout<