#include typedef long long ll; using namespace std; ll f[2][305][305],ans=1;//???j?,??k????? const ll mod=998244353; int n,cnt[305]; bool ck(int cur,int x,int y){ for(int i=cur-1;i;i--){ int nx=max(x,x*2-cnt[i]),ny=max(y,cnt[i]-x+y); x=nx,y=ny; } return x<=y; } int lim[305]; bool ck(int x,int y){return y>=lim[x];} int main(){ cin>>n; // n=300; for(int i=1;i<=n;i++){ int x;cin>>x; // x=i; cnt[max(x,1)]++; if(x==0||x==1)ans=0; } f[1][0][0]=1; for(int i=300;i;i--){ int now=(i&1),lst=now^1; int pos=0; for(int j=0;j<=300;j++){ while(pos<=300&&!ck(i,j,pos))pos++; lim[j]=pos; } if(i==1){ for(int j=0;j<=300;j++){ for(int k=0;k<=300;k++){ if(!f[lst][j][k])continue; f[lst][j][k]%=mod; if(!f[lst][j][k])continue; for(int x=0;x<=300;x++){ int jj=max(j,j*2+x-cnt[i]),kk=max(k,cnt[i]-j-x+k); if(jj>n)break; if(jj==0){ int nj=max(j,j*2+x+1-cnt[i]),nk=max(k,cnt[i]-j-x+k-1); if((nj==0||!ck(nj,nk))&&ck(jj+1,kk)){ ans=(ans+f[lst][j][k]*(x+2)); } } f[now][jj][kk]=(f[now][jj][kk]+f[lst][j][k]*(x+1)); if(jj>0&&x>0&&ck(jj,kk)){ ans=(ans+f[lst][j][k]*(x+1)); } } f[lst][j][k]=0; } } } else{ for(int j=0;j<=300;j++){ for(int k=0;k<=300;k++){ if(!f[lst][j][k])continue; f[lst][j][k]%=mod; if(!f[lst][j][k])continue; for(int x=0;x<=300;x++){ int jj=max(j,j*2+x-cnt[i]),kk=max(k,cnt[i]-j-x+k); if(!ck(jj,kk))break; if(jj==0){ int nj=max(j,j*2+x+1-cnt[i]),nk=max(k,cnt[i]-j-x+k-1); if((nj==0||!ck(nj,nk))&&ck(jj+1,kk)){ ans=(ans+f[lst][j][k]); } } f[now][jj][kk]=(f[now][jj][kk]+f[lst][j][k]); if(jj>0&&x>0)ans=(ans+f[lst][j][k]); } f[lst][j][k]=0; } } } ans%=mod; } cout<