【CSP-S 2019 D2 T1】P5664 Emiya 家今天的饭
HyperlinkHyperlinkHyperlink
https://www.luogu.com.cn/problem/P5664
DescriptionDescriptionDescription
有nnn种菜,mmm种烹饪方法,对于第iii种菜,用第jjj种烹饪方法可以做出ai,ja_{i,j}ai,j种菜
首先这个人至少做1种菜,每道菜的烹饪方法都不相同,但是如果这个人做了kkk道菜,那么每种菜最多只能做k/2k/2k/2种
求方案数,带模数
数据范围:n≤100,m≤2000n\leq 100,m\leq 2000n≤100,m≤2000
SolutionSolutionSolution
对于m<4m<4m<4的情况,直接做多位背包可以拿到64ptsptspts的高分
考虑容斥搞,最终答案即为 总抄的方案数-只有一道菜超过了k/2k/2k/2的方案数
记s[i]s[i]s[i]表示第iii种菜所有烹饪方法一共的烹饪菜式
显然总抄的方案数为(s[i]s[i]s[i]+1)【+1是因为你可以不用这种烹饪方法做菜】相乘的积-1【-1是因为你不能所有菜都不做】,我们记此为ans=∏(s[i]+1)−1ans=\prod(s[i]+1)-1ans=∏(s[i]+1)−1
考虑如何计算只有一道菜超过了k/2k/2k/2的方案数
我们记这个超过k/2k/2k/2的菜为主菜,其它菜为辅菜,显然可以枚举哪种菜是主菜(即枚举kkk)
设主菜个数为aaa,辅菜个数为bbb,显然只要a>ba>ba>b,这个方案就是可以统计的
注意到我们只关心a−ba-ba−b的值,所以我们直接以它做dpdpdp,注意到a−ba-ba−b可能小于0,同时加上max{a−b}=100max\{a-b\}=100max{a−b}=100即可
则设f[i][j=(a−b)]f[i][j=(a-b)]f[i][j=(a−b)]表示对于第kkk种烹饪方法,现在已经做了iii种菜,主菜与辅菜的差值为jjj
设对于kkk这种烹饪方法选主菜的方案数为A[i]A[i]A[i],显然A[i]=a[i][k]A[i]=a[i][k]A[i]=a[i][k]
设对于kkk这种烹饪方法选辅菜的方案数为B[i]B[i]B[i],显然B[i]=s[i]−A[i]B[i]=s[i]-A[i]B[i]=s[i]−A[i]
状态转移就比较显然了
f[i][j]=f[i−1][j]+f[i−1][j−1]×A[i]+f[i−1][j+1]×B[i]f[i][j]=f[i-1][j]+f[i-1][j-1]\times A[i]+f[i-1][j+1]\times B[i]f[i][j]=f[i−1][j]+f[i−1][j−1]×A[i]+f[i−1][j+1]×B[i]
三项分别表示:不选,选主菜,选辅菜
注意选主菜要求j>0j>0j>0,但是辅菜一直可以选
则每次对答案的贡献即为∑i=1nf[n][i]\sum_{i=1}^n f[n][i]∑i=1nf[n][i]
时间复杂度:O(n2m)O(n^2m)O(n2m)
备注:
- 代码中的ansansans是没有-1而是到最后才-1的
- 代码中的fff是滚动的
- 代码中因为jjj有可能是负数,所以统一加了100
- 如果题意不能理解,这里有另一种理解
给定一个n×mn\times mn×m的矩阵,不能不选,每一行只能选一个,每一列可以选k/2k/2k/2个,求方案数(这里的选谁表示乘上它的值作贡献)
CodeCodeCode
#include<cctype>
#include<cstdio>
#include<cstring>
#define LL long long
#define N 100
#define mod 998244353
using namespace std;int n,m;
LL s[N+10],ans=1,a[N+10][2010],A[N+10],B[N+10],f[2][N*2+20],sum;
inline LL read()
{char c;LL d=1,f=0;while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;return d*f;
}
signed main()
{n=read();m=read();for(register int i=1;i<=n;i++){for(register int j=1;j<=m;j++) s[i]=(s[i]+(a[i][j]=read()))%mod;ans=ans*(s[i]+1)%mod;}for(register int k=1;k<=m;k++){for(register int i=1;i<=n;i++) {A[i]=a[i][k];B[i]=(s[i]-A[i]+mod)%mod;}memset(f[0],0,sizeof(f[0]));f[0][100]=1;for(register int i=1;i<=n;i++){memcpy(f[i&1],f[i&1^1],sizeof(f[i&1]));for(register int j=N-i;j<=i+N;j++){(f[i&1][j]+=f[i&1^1][j+1]*B[i])%=mod;if(j>0) (f[i&1][j]+=f[i&1^1][j-1]*A[i])%=mod;}}for(register int i=1+N;i<=n+N;i++) (sum+=f[n&1][i])%=mod;}printf("%lld",(ans-1-sum+mod)%mod);
}
【CSP-S 2019 D2 T1】P5664 Emiya 家今天的饭相关推荐
- 洛谷P5664 Emiya 家今天的饭
题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nn 种烹饪方法,且会使用 mm 种主要食材做菜.为了方便叙述,我们对烹饪方法从 1 \sim n1∼n 编号,对主要食材从 1 \sim m1∼ ...
- 洛谷 P5664 Emiya 家今天的饭【dp】
... 题目: 题意: 分析: 代码: 题目: 传送门 题意: 有一个n∗mn*mn∗m的矩阵,(x,y)(x,y)(x,y)表示由xxx方法和yyy食材做出的菜有多少种 我们可以选择一些菜来制作,但 ...
- [CSP day2T1]Emiya 家今天的饭
Emiya 家今天的饭 题解 挺容易的一道dp,我们可以先考虑容斥.先加上不考虑菜数不超过一半的值,再减去超过一半的部分. 表示在前i种中选j个菜的总种类,这个dp很好想, 下面就是最重要的了. 表示 ...
- NOIP2019 Emiya家今天的饭
NOIP2019 Emiya家今天的饭 ACM退役选手远程口胡 csf如今真的是太菜了,最后16分的做法愣是想了一下午 考虑使用容斥方法: 1 采用动态规划,先求出在无限制情况下,安排kkk种烹饪方法 ...
- 【CSP-S2019】D2T1 Emiya 家今天的饭
CSP-S2019 D2T1 Emiya 家今天的饭 题目 题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nnn 种烹饪方法,且会使用 mmm 种主要食材做菜.为了方便叙述,我们对烹饪方法从 ...
- 2019CSP-S Day2T1 Emiya 家今天的饭 题解
2019CSP-S Day2T1 Emiya 家今天的饭 题解 题目链接 我太菜了 64pts,m<=3m <= 3m<=3. 前64pts数据规模都差不多,因为mmm很小,考虑类似 ...
- 【CSP-S 2019】【洛谷P5664】Emiya 家今天的饭【dp】
题目 题目链接:https://www.luogu.org/problem/P5664 Emiya 是个擅长做菜的高中生,他共掌握 nnn 种烹饪方法,且会使用 mmm 种主要食材做菜.为了方便叙述, ...
- Emiya家今天的饭
题目来源: Emiya家的饭 代码 #include <bits/stdc++.h> using namespace std; const int MOD = 998244353; con ...
- CSP-S2019学习笔记:Emiya家今天的饭
题目名称看样子灵感来自于日本动画片"卫宫家今天的饭". 这道题的难度是"提高+/省选-",算是提高组里比较难的.数据范围分的很细,解题方法跟数据范围关系比较大. ...
最新文章
- linux基础知识-链接列表
- nginx 访问控制 防盗链
- 安装 | 手把手教你Android studio 3.5.2安装(安装教程)
- 2_6 CompositeMode.cpp 组合模式
- c# getresponsestream返回byte[]_C++模版和C#范型求同存异录(一)sizeof(T)
- OJ(Online Judge)系统汇总
- 2016.8-2017.1 六履带四摆臂移动机器人测控系统
- 优秀常用网站汇总.txt
- java删除目录下符合条件的文件
- iOS 算法的前世今生:算法原理、常用算法(一)排序算法
- 用Wineskin在Mac上运行exe文件
- chrome 下载东西 失败禁止_chrome谷歌浏览器下载文件失败如何解决
- USBCleaner v6.0 Build 20080327 - U盘病毒专杀工具
- HDLBits—Exams/ece241 2014 q7a
- 新美域杂志新美域杂志社新美域编辑部2022年第6期目录
- 若依管理系统漏洞利用
- 在索智SC3807VS EVB上调试开发以太网功能(使用V3s的内部EMAC+PHY)
- GetDc与GetWindowDc的含义
- 408计算机网络04-HTTP 长连接短连接使用场景是什么
- python3文件读写实例_2.2.3.1Python-实例---文件读写
热门文章
- 马斯克的第一性原理是什么?
- 算法-图论_关键节点的判断
- Java调用方法,键盘录入数据,分别求出长方形的面积和长方体的体积。
- 首涂第十八套苹果CMSv10自适应热销资源网站专用多功能视频模板
- C-NCAP 2025主动安全ADAS测试研究
- 上市,叮咚买菜的生门?
- liner中文翻译_欧路词典|英汉-汉英词典 liner是什么意思_liner的中文解释和发音_liner的翻译_liner怎么读...
- 原生js完成一个简单的抽奖功能
- 用R中ggplot2包做箱线图、折线图、条形图
- 未来五年,千万不要错过这波红利!