#include<cstdio>
typedef long long ll;
const int MAXN=110,MAXM=2005,Mod=998244353;
int n,m,a[MAXN][MAXM];
ll s[MAXN],f[MAXN][MAXN*2],ans;
int main(){
scanf("%d%d",&n,&m);
ans=1;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++)
scanf("%d",a[i]+j),s[i]+=a[i][j];
ans=ans*(s[i]+1)%Mod;
}
ans=(ans-1+Mod)%Mod;
for(int i=1; i<=m; i++){
f[0][n+2]=1;
for(int j=1; j<=n; j++){
for(int k=1; k<=n*2+5; k++){
f[j][k]=(f[j-1][k]+f[j-1][k-1]*a[j][i]%Mod+(s[j]-a[j][i])%Mod*f[j-1][k+1]%Mod)%Mod;
}
}
for(int i=n+3; i<=n*2+5; i++)
ans=(ans-f[n][i]+Mod)%Mod;
}
printf("%lld\n",ans);
return 0;
}
这份代码88
#include<cstdio>
typedef long long ll;
const int MAXN=110,MAXM=2005,Mod=998244353;
int n,m,a[MAXN][MAXM];
ll s[MAXN],f[MAXN][MAXN*2],ans;
int main(){
scanf("%d%d",&n,&m);
ans=1;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++)
scanf("%d",a[i]+j),s[i]+=a[i][j],s[i]%=Mod;
ans=ans*(s[i]+1)%Mod;
}
ans=(ans-1+Mod)%Mod;
for(int i=1; i<=m; i++){
f[0][n+2]=1;
for(int j=1; j<=n; j++){
for(int k=1; k<=n*2+5; k++){
f[j][k]=(f[j-1][k]+f[j-1][k-1]*a[j][i]%Mod+(s[j]-a[j][i]+Mod)%Mod*f[j-1][k+1]%Mod)%Mod;
}
}
for(int i=n+3; i<=n*2+5; i++)
ans=(ans-f[n][i]+Mod)%Mod;
}
printf("%lld\n",ans);
return 0;
}
这AC
区别就是s要不要取模,感觉没啥区别啊