#define M 200005 #include #include using namespace std; using mint=atcoder::modint998244353; int n,a[M],l[M],r[M],o[M],t[M][2],f[M],s[M]; vectorc[M]; mint F[M],iF[M]; void d(int x){l[r[x]]=l[x];r[l[x]]=r[x];} mint C(int n,int k){return n>=k&&k>=0?F[n]*iF[k]*iF[n-k]:0;} void D(int u){s[u]=1;for(int v:c[u])D(v),s[u]+=s[v];} int main(){ scanf("%d",&n); F[0]=1;for(int i=1;i<=n;i++)F[i]=F[i-1]*i; iF[n]=F[n].inv();for(int i=n;i;i--)iF[i-1]=iF[i]*i; for(int i=1;i<=n;i++)scanf("%d",a+i),l[i]=i-1,r[i]=i+1,t[i][0]=t[i][1]=-1; queueq; for(int i=1;i<=n;i++)if(!a[i]&&(l[i]<1||a[l[i]]>0)&&(r[i]>n||a[r[i]]>0))q.push(i); int T=0,O=1; while(!q.empty()){ int x=q.front();q.pop();o[x]=++T; int u=l[x],v=r[x]; if(u>=1){if(!a[u]){O=0;break;}t[x][0]=u;a[u]--;} if(v<=n){if(!a[v]){O=0;break;}t[x][1]=v;a[v]--;} d(x); if(u>=1&&!a[u]&&(l[u]<1||a[l[u]]>0)&&(r[u]>n||a[r[u]]>0))q.push(u); if(v<=n&&!a[v]&&(l[v]<1||a[l[v]]>0)&&(r[v]>n||a[r[v]]>0))q.push(v); if(!O||T==n-1)break; } if(T!=n-1||!O){puts("0");return 0;} int R=0;for(int i=1;i<=n;i++)if(!o[i])R=i; o[R]=n; for(int i=1;i<=n;i++)if(t[i][0]>=0||t[i][1]>=0)f[i]=t[i][0]<0?t[i][1]:t[i][1]<0?t[i][0]:(o[t[i][0]]=0&&t[i][1]>=0)A*=C(s[t[i][0]]+s[t[i][1]],s[t[i][0]]); if(c[R].size()>=2){ int S=0;for(int v:c[R])S+=s[v]; A*=F[S];for(int v:c[R])A*=iF[s[v]]; } printf("%d\n",A.val()); }