#include #include #include #define mod 998244353 using namespace std; int t,n,m,x,cnt[115],sum[115],f[115][105][105],ok[115][105][105]; void upd(int &x,int y){ x+=y; if (x>=mod)x-=mod; return; } int check(int now,int rest,int d){ if ((now+1)*d>n)return 0; if (now==0){ if (d<=rest+cnt[now])return 1; return 0; } if (ok[now][rest][d]!=-1)return ok[now][rest][d]; if (cnt[now]>=d)return ok[now][rest][d]=check(now-1,rest+cnt[now]-d,d); return ok[now][rest][d]=check(now-1,rest,d+(d-cnt[now])); } int dfs(int now,int rest,int d){ if ((now+1)*d>n)return 0; if (f[now][rest][d]!=-1)return f[now][rest][d]; int ans=0; for (int i=0;i<=n;i++){ int _rest=rest,_d=d; if (cnt[now]>=i+d)_rest+=cnt[now]-(i+d); else _d+=(i+d)-cnt[now]; if (now>0)upd(ans,dfs(now-1,_rest,_d)); if (i>0){ if (now==0){ if (i+d<=rest+cnt[now])upd(ans,1); } else{ if (_d>0){ if (check(now-1,_rest,_d))upd(ans,1); } else if ((_rest==0&&sum[now-1]==0)||check(now-1,_rest+1,1))upd(ans,1); } } } return f[now][rest][d]=ans; } int main(){ t=1; while(t--){ cin>>n; memset(cnt,0,sizeof(cnt)); for (int i=1;i<=n;i++){ cin>>x; cnt[x]++; } m=114; sum[0]=cnt[0]; for (int i=1;i<=m;i++)sum[i]=cnt[i]+sum[i-1]; memset(f,-1,sizeof(f)); memset(ok,-1,sizeof(ok)); cout<