#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() #define sz(x) (int)(x).size() using ll = long long; using ull = unsigned long long; using ld = long double; using pl = pair; using vi = vector; using vl = vector; using vvl = vector>; using vvvl = vector>>; template using pq_ = priority_queue, greater>; #define sz(x) (int)(x).size() typedef pair pii; using mint=modint998244353; // g++ a.cpp -std=c++23 -I. // g++ -std=c++23 -I. a.cpp -o main // g++ -std=c++23 -I. anaive.cpp -o naive // g++ -std=c++23 -I. agene.cpp -o gene #include #include namespace mp = boost::multiprecision; using Bint = mp::cpp_int; using Real = mp::number>; mint solve(vl &a,vector &bik,vector &gbik){ vl uc; ll nowc=0; rep(i,0,a.size()){ if(a[i]==1)nowc++; else uc.push_back(nowc); } ll n=uc.size(); ll m=nowc; ll d=0; ll e=-1; mint now=bik[n+m]*gbik[n]*gbik[m]; mint nows=0; mint u=1; mint anss=0; mint ans=0; mint miniu=1; rep(i,0,n){ //cout<=0)now-=bik[i+d]*gbik[i]*gbik[d]*bik[n-i+(m-1-(d))]*gbik[n-i]*gbik[m-1-(d)]; while(e=0)nows-=bik[i+1+e]*gbik[i+1]*gbik[e]*bik[n+1-(i+1)+(m-2-(e))]*gbik[n+1-(i+1)]*gbik[(m-2-(e))]; //cout< bik(trc+1); vector gbik(trc+1); bik[0]=1; rep(i,0,trc){ bik[i+1]=bik[i]*(i+1); } gbik[trc]=1/bik[trc]; rep(i,0,trc){ gbik[trc-i-1]=gbik[trc-i]*(trc-i); } ll n; cin>>n; vl a; rep(i,0,n){ ll k; cin>>k; rep(i,0,k)a.push_back(1); if(i!=n-1)a.push_back(0); } mint ans=0; ans+=solve(a,bik,gbik); rep(i,0,a.size()){ a[i]=1-a[i]; } ans+=solve(a,bik,gbik); cout<