//https://www.youtube.com/watch?v=Po8C2i6_ua4 #include #include using namespace std; using namespace atcoder; #define rep(i, l, r) for (ll i = (l); i < (r); ++i) #define all(x) (x).begin(), (x).end() using ll = long long; using pl = pair; using vl = vector; using vvl = vector>; #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") using mint=modint998244353; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); ll n; cin>>n; vl z(n); rep(i,0,n)cin>>z[i]; ll r=0; rep(i,0,n){ r+=z[i]; } if(r>2*n){ cout<<0< bik(310000); vector gbik(310000); bik[0]=1; rep(i,0,300000){ bik[i+1]=bik[i]*(i+1); gbik[i]=1/bik[i]; } mint ans=1; stack s; rep(i,0,2*n+5)s.push(0); stack u; rep(i,0,2*n+5)u.push(0); stack d; rep(i,0,2*n+5)d.push(0); rep(i,0,n){ z[i]+=2; ll p=0; while(s.top()==1){ ans*=bik[i+1-u.top()-2]*gbik[i+1-d.top()-1]*gbik[d.top()-u.top()-1]; p++; s.pop(); u.pop(); d.pop(); } d.pop(); d.push(i+1); s.pop(); s.push(1); if(p+2>z[i]){ cout<<0<