AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 校园
  • 应用
  • 文章
    • 题解
    • 分享
    • 问答
  • 吐槽
  • 登录/注册

AcWing 1155. Emiya 家今天的饭

作者: 作者的头像   Aigrl ,  2022-04-26 16:12:53 ,  所有人可见 ,  阅读 6


1


/*
本题有三个条件
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));
}

1 评论


用户头像
Aigrl   28天前     回复

OI Wiki


你确定删除吗?
1024
x

© 2018-2022 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息