#include using namespace std; #if __has_include() #include using namespace atcoder; templateistream &operator>>(istream &is,static_modint &a){long long b;is>>b;a=b;return is;} istream &operator>>(istream &is,modint &a){long long b;cin>>b;a=b;return is;} #endif #ifdef LOCAL #include "debug.h" #else #define debug(...) static_cast(0) #define debugg(...) static_cast(0) #define esper(...) static_cast(0) templateostream &operator<<(ostream &os,const pair&p){os<; templateusing minque=priority_queue,greater>; templatebool chmax(T &a,const T &b){return (abool chmin(T &a,const T &b){return (a>b?(a=b,true):false);} templateistream &operator>>(istream &is,pair&p){is>>p.first>>p.second;return is;} templateistream &operator>>(istream &is,vector &a){for(auto &i:a)is>>i;return is;} templatevoid operator++(pair&a,int n){a.first++,a.second++;} templatevoid operator--(pair&a,int n){a.first--,a.second--;} templatevoid operator++(vector&a,int n){for(auto &i:a)i++;} templatevoid operator--(vector&a,int n){for(auto &i:a)i--;} #define reps(i,a,n) for(int i=(a);i(0) ll myceil(ll a,ll b){return (a+b-1)/b;} template auto vec(const int (&d)[n],const T &init=T()){ if constexpr (id(d,init)); else return init; } void SOLVE(); int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout<>testcase; for(int i=0;i struct factorial_table{ private: int mod,capacity; vectorfact,factinv,inv; void resize(int n){ fact.resize(n+1),factinv.resize(n+1),inv.resize(n+1); for(int i=capacity+1;i<=n;i++){ fact[i]=fact[i-1]*i; inv[i]=-inv[mod%i]*(mod/i); factinv[i]=factinv[i-1]*inv[i]; } capacity=n; } public: factorial_table():capacity(1),mod(T::mod()),fact{1,1},factinv{1,1},inv{0,1}{} T C(int n,int k){ if(n T O(INT...k){ int n=0; for(int i:initializer_list{k...}){ if(i<0)return 0; n+=i; } if(capacity{k...})ret*=factinv[i]; return ret; } }; using mint=modint998244353; factorial_tabletable; void SOLVE(){ int n; cin>>n; vectora(n); cin>>a; if(reduce(all(a))&1)fin(0); string s=string(a[0],'1')+'0'; reps(i,1,n){ s+=string(a[i]-a[i-1],'1'); s+='0'; } string l,r; rep(i,s.size()){ (i&1?l:r)+=s[i]; } vectorb,c; auto f=[](string s)->vector { vectora; int cnt=0; rep(i,s.size()){ if(s[i]=='1')cnt++; else{ a.push_back(cnt); } } return a; }; b=f(l),c=f(r); auto calc=[](vectora)->mint { mint ret=1; fenwick_treeBIT(1001); rep(i,a.size()){ reps(j,1,a[i]+1){ ret*=BIT.sum(j,1001)+a[i]-j+1; } BIT.add(a[i],1); } return table.factorial(reduce(all(a)))/ret; }; int as=reduce(all(b)),bs=reduce(all(c)); if((as+bs)*2!=reduce(all(a)))fin(0); cout<<(table.C(as+bs,as)*calc(b)*calc(c)).val()<