洛咕

题意:原题面见链接,简单来说就是给出一个\(n*m\)的矩阵,每一行代表同一种烹饪方法,每一列代表同一种食材,\(a_{i,j}\)表示使用第i种烹饪方法第j种食材能做出多少种菜,要求至少做一道菜,而且每种烹饪方法至多用一次,并且每种食材不超过总菜数的一半,问有多少种做菜的方案?

分析:直观来讲就是在矩阵上选数,每一行要么不选数要么选一个数,每一列选的数不超过所有选数的一半。

如果只考虑前两个限制条件,设\(g[i][j]\)表示前i行选了j个数的方案数,则\(g[i][j]=g[i-1][j]+g[i-1][j-1]*sum[i]\),其中\(sum[i]\)表示第i行所有数(菜的种类)的和,则总方案数为\(\sum_{j=1}^{n}g[n][j]\)。

再考虑第三个限制条件,拿上面所求的总方案数减掉其中不合法的方案数(不满足第三个限制条件的),对于第\(k\)列,设\(f[i][j]\)表示前i行选的数中,在第k列的总数减去不在第k列的总数为j的情况下 的方案数,则\(f[i][j]=f[i-1][j]+f[i-1][j-1]*a[i][k]+f[i-1][j+1]*(sum[i]-a[i][k])\),注意\(j\)的范围应该是\([-n,n]\),所以可以统一右移\(n\)个单位,则不满足第三个限制条件的方案数为\(\sum_{k=1}^{m}\sum_{j=n+1}^{2n}f[n][j]\)。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){
int x=0,o=1;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')o=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*o;
}
const int N=105;
const int M=2005;
const int mod=998244353;
int a[N][M],sum[N],g[N][N],f[N][N*2];
int main(){
int n=read(),m=read();
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
a[i][j]=read();
sum[i]=(sum[i]+a[i][j])%mod;
}
}
g[0][0]=1;
for(int i=1;i<=n;++i){
g[i][0]=1;
for(int j=1;j<=i;++j){
g[i][j]=g[i-1][j]+(1ll*g[i-1][j-1]*sum[i])%mod;
g[i][j]%=mod;
}
}
ll tot1=0,tot2=0;
for(int j=1;j<=n;++j)tot1=(tot1+g[n][j])%mod;
for(int k=1;k<=m;++k){
memset(f,0,sizeof(f));
f[0][n]=1;//f[0][0]=1
for(int i=1;i<=n;++i)
for(int j=n-i;j<=n+i;++j){
f[i][j]=f[i-1][j];
f[i][j]=(f[i][j]+(1ll*f[i-1][j-1]*a[i][k])%mod)%mod;
f[i][j]=(f[i][j]+(1ll*f[i-1][j+1]*(sum[i]-a[i][k]))%mod)%mod;
}
for(int j=n+1;j<=n*2;++j)tot2=(tot2+f[n][j])%mod;
}
cout<<((tot1-tot2)%mod+mod)%mod<<endl;
return 0;
}

[CSP-S2019] Emiya 家今天的饭的更多相关文章

  1. 洛谷P5664 Emiya 家今天的饭 问题分析

    首先来看一道我编的题: 安娜写宋词 题目背景 洛谷P5664 Emiya 家今天的饭[民间数据] 的简化版本. 题目描述 安娜准备去参加宋词大赛,她一共掌握 \(n\) 个 词牌名 ,并且她的宋词总共 ...

  2. 洛谷P5664 Emiya 家今天的饭 题解 动态规划

    首先来看一道题题: 安娜写宋词 题目背景 洛谷P5664 Emiya 家今天的饭[民间数据] 的简化版本. 题目描述 安娜准备去参加宋词大赛,她一共掌握 \(n\) 个 词牌名 ,并且她的宋词总共有 ...

  3. Emiya家今天的饭 NOIP2019 (CSP?) 类DP好题 luoguP5664

    luogu题目传送门! 首先,硬求可行方案数并不现实,因为不好求(去年考场就这么挂的,虽然那时候比现在更蒟). 在硬搞可行方案数不行之后,对题目要求的目标进行转换: 可行方案数 = 总方案数 - 不合 ...

  4. 【CSP-S 2019】【洛谷P5664】Emiya 家今天的饭【dp】

    题目 题目链接:https://www.luogu.org/problem/P5664 Emiya 是个擅长做菜的高中生,他共掌握 \(n\) 种烹饪方法,且会使用 \(m\) 种主要食材做菜.为了方 ...

  5. 【CSP-S 2019】D2T1 Emiya 家今天的饭

    Description 传送门 Solution 算法1 32pts 爆搜,复杂度\(O((m+1)^n)\) 算法2 84pts 裸的dp,复杂度\(O(n^3m)\) 首先有一个显然的性质要知道: ...

  6. CSP2019 Emiya 家今天的饭 题解

    这题在考场上只会O(n^3 m),拿了84分.. 先讲84分,考虑容斥,用总方案减去不合法方案,也就是枚举每一种食材,求用它做超过\(\lfloor \frac{k}{2} \rfloor\) 道菜的 ...

  7. Emiya 家今天的饭

    \(dp_{i,j,k}\)表示前\(i\)种烹饪方法,假设最多的是食材\(j\),食材\(j\)比其他食材多\(k\)次出现 其中\(i \in [1,n],j \in [1,m],k \in [- ...

  8. 【NOIP/CSP2019】D2T1 Emiya 家今天的饭

    这个D2T1有点难度啊 原题: 花了我一下午的时间,作为D2T1的确反常 条件很奇怪,感觉不太直观,于是看数据范围先写了个暴力 写暴力的时候我就注意到了之前没有仔细想过的点,烹饪方式必须不同 虽然a很 ...

  9. csp2019 Emiya家今天的饭题解

    qwq 由于窝太菜了,实在是不会,所以在题解的帮助下过掉了这道题. 写此博客来整理一下思路 正文 传送 简化一下题意:现在有\(n\)行\(m\)列数,选\(k\)个数的合法方案需满足: 1.一行最多 ...

  10. 【JZOJ6433】【luoguP5664】【CSP-S2019】Emiya 家今天的饭

    description analysis 首先可以知道不符合要求的食材仅有一个,于是可以容斥拿总方案数减去选不合法食材的不合法方案数 枚举选取哪一个不合法食材,设\(f[i][j]\)表示到第\(i\ ...

随机推荐

  1. vue中h函数的使用

    1. h() 函数是一个用于创建 vnode,其实在vue中是createVNode 函数的简写 h()函数接受三个参数 参数1. 标签名或组件 参数2. 标签的属性或事件 参数3. 内容使用: // ...

  2. Bouncy Castle密码算法库

    Bouncy Castle密码算法库 一.开发背景 Bouncy Castle 是一种用于 Java 平台的开放源码的轻量级密码术包.它支持大量的密码术算法,并提供 JCE 1.2.1 的实现.因为 ...

  3. java学习日记20230228-变量

    JAVA变量 变量是程序的基本组成单位 变量的3要素:类型 名称 值 int a = 1:定义了一个变量 int整数类型,名称为a,值为1 内存里面分配个空间,空间里的值为1 变量相当于 内存中一个数 ...

  4. c++ 时间类型详解 time_t(转)

    原文链接:https://blog.csdn.net/love_gaohz/article/details/6637625 Unix时间戳(Unix timestamp),或称Unix时间(Unix ...

  5. SAP 后台任务定时job

    定时任务的事务码 sm36:创建定时任务 sm37:查看定时任务 JDBG:后台任务debug,在对应的sm37中对应的job页面 t-code输入 创建定时任务SM36 名称可以随便起 一般都是按自 ...

  6. linux开放指定端口

      sudo ufw allow 端口号

  7. 十二、21.提交本地代码到Git仓库并推送到码云

    查看分支 运行git add . 把所有修改过后文件添加到暂存区 git commit 把当前所有的代码提交到rights分支 加-m加一个消息 到此所有的功能模块都已经提交到了rights这个分支里 ...

  8. 30分钟熟练使用最常用的ES6,还不学是等着被卷死?

    一. 关于ES6 了解一门技术或者语言,最好的方法就是知道它能做些什么 ES6 , 它是由 ECMA 国际标准化组织,制定的一项脚本语言的标准化规范 那么它为什么会出现呢? 每一次标准的诞生都意味着语 ...

  9. asp.net.core学习笔记1:swagger的使用和webapi接收Jobject对象

    环境:asp.net.core 3.1 (一觉醒来官方已经不推荐3.0了,于是没有任何core经验,也只能开始了3.1的开发学习) 由于现有项目前后端分离.微服务化日趋流行,所以上手不采用web应用( ...

  10. js复选框,三层结构

    最终实现效果如下 html+css如下 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 < ...