提交时间:2024-11-28 13:00:44
运行 ID: 35143
#include<bits/stdc++.h> using namespace std; #define int long long int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=4010,N=20,Mod=998244353; int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod,y>>=1;}return rt;} int n,k,ans,f[MAXN][MAXN],g[MAXN][MAXN]; char c[MAXN]; void add(int &x,int y){x+=y;if(x>=Mod)x-=Mod;} void slv(){ n=read(); scanf("%s",c+1); g[0][0]=f[0][0]=1; for(int j=1;j<=n;j++)g[0][j]+=g[0][j-1]; for(int i=1;i<=n;i++){ for(int j=0;j<=i;j++){ if(c[i]=='0'){ add(f[i][j],f[i-1][j-1]*(j-1)%Mod); add(f[i][j],g[i-1][j-1]); } else add(f[i][j],f[i-1][j]*(i-j)%Mod); } g[i][0]=f[i][0]; for(int j=1;j<=n;j++)add(g[i][j],(g[i][j-1]+f[i][j])%Mod); } for(int i=1;i<=n;i++)add(ans,f[n][i]); printf("%lld",ans); } signed main(){ // jc[0]=ny[0]=1;for(int i=1;i<=MAXN-5;i++)jc[i]=jc[i-1]*i%Mod,ny[i]=Pow(jc[i],Mod-2); slv(); return 0; }