作者:
Aigrl
,
2022-04-26 16:12:53
,
所有人可见
,
阅读 6
/*
本题有三个条件
A.至少做一道菜
B.每道菜的烹饪方法互不相同
C.每种主要食材至多在一半的菜中被使用
由 B 知,烹饪方法可以作为阶段,
C 中满足的状态是一个区间,所以需要多开一维来储存,
我们求的是方案数,同时有乘法,需要初始化 1
因为总值是固定的,可以剔掉。
*/
#include <bits/stdc++.h>
#define int long long
#define mod(a) (a + 998244353) % 998244353
using namespace std;
const int N = 110, M = 2010;
int n, m;
int w[N][M];
int s[N], tos[M], f[N][2 * N];
int sum;
signed main()
{
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= m; j ++ )
scanf("%lld", &w[i][j]);
sum = 1;
for (int i = 1; i <= n; i ++ )
{
int op = 0;
for (int j = 1; j <= m; j ++ )
op = mod(op + w[i][j]);
sum = mod(sum * (op + 1));
s[i] = op;
}
for (int t = 1; t <= m; t ++ )
{
memset(f, 0, sizeof f);
f[0][n + 1] = 1;
for (int i = 1; i <= n; i ++ )
for (int k = -n; k <= n; k ++ )
{
int j = k + n + 1;
f[i][j] = f[i - 1][j];
f[i][j] += mod(f[i - 1][j - 1] * w[i][t]);
f[i][j] += mod(f[i - 1][j + 1] * mod(s[i] - w[i][t]));
f[i][j] = mod(f[i][j]);
}
for (int i = 1; i <= n; i ++ )
tos[t] = mod(tos[t] + f[n][i + n + 1]);
sum = mod(sum - tos[t]);
}
printf("%lld", mod(sum - 1));
}
OI Wiki