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=1n​f[n][i]

时间复杂度:O(n2m)O(n^2m)O(n2m)
备注:

  1. 代码中的ansansans是没有-1而是到最后才-1的
  2. 代码中的fff是滚动的
  3. 代码中因为jjj有可能是负数,所以统一加了100
  4. 如果题意不能理解,这里有另一种理解

给定一个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 家今天的饭相关推荐

  1. 洛谷P5664 Emiya 家今天的饭

    题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nn 种烹饪方法,且会使用 mm 种主要食材做菜.为了方便叙述,我们对烹饪方法从 1 \sim n1∼n 编号,对主要食材从 1 \sim m1∼ ...

  2. 洛谷 P5664 Emiya 家今天的饭【dp】

    ... 题目: 题意: 分析: 代码: 题目: 传送门 题意: 有一个n∗mn*mn∗m的矩阵,(x,y)(x,y)(x,y)表示由xxx方法和yyy食材做出的菜有多少种 我们可以选择一些菜来制作,但 ...

  3. [CSP day2T1]Emiya 家今天的饭

    Emiya 家今天的饭 题解 挺容易的一道dp,我们可以先考虑容斥.先加上不考虑菜数不超过一半的值,再减去超过一半的部分. 表示在前i种中选j个菜的总种类,这个dp很好想, 下面就是最重要的了. 表示 ...

  4. NOIP2019 Emiya家今天的饭

    NOIP2019 Emiya家今天的饭 ACM退役选手远程口胡 csf如今真的是太菜了,最后16分的做法愣是想了一下午 考虑使用容斥方法: 1 采用动态规划,先求出在无限制情况下,安排kkk种烹饪方法 ...

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

    CSP-S2019 D2T1 Emiya 家今天的饭 题目 题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nnn 种烹饪方法,且会使用 mmm 种主要食材做菜.为了方便叙述,我们对烹饪方法从 ...

  6. 2019CSP-S Day2T1 Emiya 家今天的饭 题解

    2019CSP-S Day2T1 Emiya 家今天的饭 题解 题目链接 我太菜了 64pts,m<=3m <= 3m<=3. 前64pts数据规模都差不多,因为mmm很小,考虑类似 ...

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

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

  8. Emiya家今天的饭

    题目来源: Emiya家的饭 代码 #include <bits/stdc++.h> using namespace std; const int MOD = 998244353; con ...

  9. CSP-S2019学习笔记:Emiya家今天的饭

    题目名称看样子灵感来自于日本动画片"卫宫家今天的饭". 这道题的难度是"提高+/省选-",算是提高组里比较难的.数据范围分的很细,解题方法跟数据范围关系比较大. ...

最新文章

  1. linux基础知识-链接列表
  2. nginx 访问控制 防盗链
  3. 安装 | 手把手教你Android studio 3.5.2安装(安装教程)
  4. 2_6 CompositeMode.cpp 组合模式
  5. c# getresponsestream返回byte[]_C++模版和C#范型求同存异录(一)sizeof(T)
  6. OJ(Online Judge)系统汇总
  7. 2016.8-2017.1 六履带四摆臂移动机器人测控系统
  8. 优秀常用网站汇总.txt
  9. java删除目录下符合条件的文件
  10. iOS 算法的前世今生:算法原理、常用算法(一)排序算法
  11. 用Wineskin在Mac上运行exe文件
  12. chrome 下载东西 失败禁止_chrome谷歌浏览器下载文件失败如何解决
  13. USBCleaner v6.0 Build 20080327 - U盘病毒专杀工具
  14. HDLBits—Exams/ece241 2014 q7a
  15. 新美域杂志新美域杂志社新美域编辑部2022年第6期目录
  16. 若依管理系统漏洞利用
  17. 在索智SC3807VS EVB上调试开发以太网功能(使用V3s的内部EMAC+PHY)
  18. GetDc与GetWindowDc的含义
  19. 408计算机网络04-HTTP 长连接短连接使用场景是什么
  20. python3文件读写实例_2.2.3.1Python-实例---文件读写

热门文章

  1. 马斯克的第一性原理是什么?
  2. 算法-图论_关键节点的判断
  3. Java调用方法,键盘录入数据,分别求出长方形的面积和长方体的体积。
  4. 首涂第十八套苹果CMSv10自适应热销资源网站专用多功能视频模板
  5. C-NCAP 2025主动安全ADAS测试研究
  6. 上市,叮咚买菜的生门?
  7. liner中文翻译_欧路词典|英汉-汉英词典 liner是什么意思_liner的中文解释和发音_liner的翻译_liner怎么读...
  8. 原生js完成一个简单的抽奖功能
  9. 用R中ggplot2包做箱线图、折线图、条形图
  10. 未来五年,千万不要错过这波红利!