为什么边乘边取模会溢出?
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define mod 998244353
using namespace std;
int n,m;
int a[50][5],dp[50][50][50];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&a[i][j]);
dp[0][0][0]=1;
for(int i=1;i<=n;++i)
for(int j=i;j>=0;--j)
for(int k=i;k>=0;--k)
for(int l=i;l>=0;--l){
int x,y,z;
if(a[i][1]&&j){
x=(dp[j-1][k][l]%mod*a[i][1]%mod)%mod;
dp[j][k][l]=(dp[j][k][l]%mod+x%mod)%mod;
}
if(a[i][2]&&k){
y=(dp[j][k-1][l]%mod*a[i][2]%mod)%mod;
dp[j][k][l]=(dp[j][k][l]%mod+y%mod)%mod;
}
if(a[i][3]&&l){
z=(dp[j][k][l-1]%mod*a[i][3]%mod)%mod;
dp[j][k][l]=(dp[j][k][l]%mod+z%mod)%mod;
}
}
int res=0;
for(int i=0;i<=n;++i)
for(int j=0;j<=n;++j)
for(int k=0;k<=n;++k){
int s=i+j+k,d=s/2;
if(s>0&&s<=n&&i<=d&&j<=d&&k<=d) res=(res%mod+dp[i][j][k]%mod)%mod;
}
printf("%d",res);
return 0;
}