#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
typedef long long ll;
const ll MOD=998244353;
const int N=250,M=2000;
int n,n2,m;
ll a[N][M],sa[N],Ans,f[N][N];
void Read()
{
Ans=1;
scanf("%d%d",&n,&m);
n2=n<<1;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
cin>>a[i][j];
sa[i]=(sa[i]+a[i][j])%MOD;
}
Ans=(Ans*(sa[i]+1))%MOD;//计算全部答案,注意不选也是一种情况
}
Ans=(Ans-1+MOD)%MOD;//减去全部不选的情况
}
void DP()
{
for(int i=1;i<=m;++i)
{
for(int j=0;j<=n2;++j)
for(int k=0;k<=n2;++k) f[j][k]=0;
f[0][0]=1;//DP初值
for(int j=1,YH=0;j<=n;++j,YH+=2)
for(int k=0;k<=YH;++k)
{
f[j][k]=(f[j][k]+f[j-1][k]*(sa[j]-a[j][i]+MOD)%MOD)%MOD,
f[j][k+1]=(f[j][k+1]+f[j-1][k])%MOD,
f[j][k+2]=(f[j][k+2]+f[j-1][k]*a[j][i]%MOD)%MOD;
}
for(int j=n+1;j<=n2;++j)
Ans=(Ans-f[n][j]+MOD)%MOD;//减去当前枚举到的不合法方案
}
}
int main()
{
Read(),DP(),cout<<Ans<<endl;
return 0;
}