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

题解:洛谷 P5664 [CSP-S 2019] Emiya 家今天的饭 题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。这些要求难不倒 Emiya,但他想知道共有多少种不同的符合要求的搭配方案。两种方案不同,当且仅当存在至少一道菜在一种方案中出现,而不在另一种方案中出现。Emiya 今天要准备一桌饭招待 Yazid 和 Rin 这对好朋友,然而三个人对菜的搭配有不同的要求,更具体地,对于一种包含。Emiya 找到了你,请你帮他计算,你只需要告诉他符合所有要求的搭配方案数对质数。个用单个空格隔开的整数,其中第。 阅读详情

题目

题目链接:https://www.luogu.org/problem/P5664

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

Emiya 做的每道菜都将使用恰好一种烹饪方法与恰好一种主要食材。更具体地,Emiya 会做 a i , j a_{i,j} ai,j​ 道不同的使用烹饪方法 i i i 和主要食材 j j j 的菜( 1 ≤ i ≤ n , 1 ≤ j ≤ m 1 \leq i \leq n, 1 \leq j \leq m 1≤i≤n,1≤j≤m),这也意味着 Emiya 总共会做 ∑ i = 1 n ∑ j = 1 m a i , j \sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} a_{i,j} i=1∑n​j=1∑m​ai,j​ 道不同的菜。

Emiya 今天要准备一桌饭招待 Yazid 和 Rin 这对好朋友,然而三个人对菜的搭配有不同的要求,更具体地,对于一种包含 k k k 道菜的搭配方案而言:

  • Emiya 不会让大家饿肚子,所以将做至少一道菜,即 k ≥ 1 k \geq 1 k≥1
  • Rin 希望品尝不同烹饪方法做出的菜,因此她要求每道菜的烹饪方法互不相同
  • Yazid 不希望品尝太多同一食材做出的菜,因此他要求每种主要食材至多在一半的菜(即 ⌊ k 2 ⌋ \lfloor \frac{k}{2} \rfloor ⌊2k​⌋ 道菜)中被使用

这里的 ⌊ x ⌋ \lfloor x \rfloor ⌊x⌋ 为下取整函数,表示不超过 x x x 的最大整数。

这些要求难不倒 Emiya,但他想知道共有多少种不同的符合要求的搭配方案。两种方案不同,当且仅当存在至少一道菜在一种方案中出现,而不在另一种方案中出现。

Emiya 找到了你,请你帮他计算,你只需要告诉他符合所有要求的搭配方案数对质数 998 , 244 , 353 998,244,353 998,244,353 取模的结果。


思路:

我菜死了。
其实这道题可以转换为一个 n × m n\times m n×m的矩阵,矩阵每一行最多只能选一个数,每一列可以选若干个数,询问有多少种方案满足选取的每一列的个数均不超过选取总个数的一半。
正难则反。我们发现,对于不合法的方案,仅有一列选取的个数会超过总个数的一半。
所以我们可以枚举超过总个数一半的那一列,然后设 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示选取到第 i i i行,枚举的超过一半的这一列选择了 j j j个,其他列选择了 k k k个的方案数。
那么这一列可以选择这一列,可以选择其他列,也可以不选。所以有方程
f [ i ] [ j ] [ k ] = f [ i − 1 ] [ j ] [ k ] + f [ i − 1 ] [ j − 1 ] [ k ] × c n t [ i ] [ j ] + f [ i − 1 ] [ j ] [ k − 1 ] × ( s u m [ i ] − c n t [ i ] [ j ] ) f[i][j][k]=f[i-1][j][k]+f[i-1][j-1][k]\times cnt[i][j]+f[i-1][j][k-1]\times (sum[i]-cnt[i][j]) f[i][j][k]=f[i−1][j][k]+f[i−1][j−1][k]×cnt[i][j]+f[i−1][j][k−1]×(sum[i]−cnt[i][j])
其中 s u m [ i ] = ∑ j = 1 m c n t [ i ] [ j ] sum[i]=\sum^m_{j=1}cnt[i][j] sum[i]=∑j=1m​cnt[i][j]
那么选取枚举的这一行超过一半,最终不合法的方案数就是
a n s = ∑ j > k f [ n ] [ j ] [ k ] ans=\sum_{j>k}f[n][j][k] ans=j>k∑​f[n][j][k]
时间复杂度 O ( m n 3 ) O(mn^3) O(mn3),这样就得到了 84 p t s 84pts 84pts的超级足的暴力分。
然而我考场这都没写出来qwq
我们发现最终只要满足 j > k j>k j>k就可以计算进答案,中间过程我们也只关心 j , k j,k j,k的大小关系。
所以我们可以省去 j , k j,k j,k那两维,设 f [ i ] [ j ] f[i][j] f[i][j]表示第 i i i行,选择超过一半的这一列比其他列多选的个数为 j j j的方案数。
那么就有方程
f [ i ] [ k ] = f [ i − 1 ] [ k ] + f [ i − 1 ] [ k − 1 ] × c n t [ i ] [ j ] + ( s u m [ i ] − c n t [ i ] [ j ] ) × f [ i − 1 ] [ k + 1 ] f[i][k]=f[i-1][k]+f[i-1][k-1]\times cnt[i][j]+(sum[i]-cnt[i][j])\times f[i-1][k+1] f[i][k]=f[i−1][k]+f[i−1][k−1]×cnt[i][j]+(sum[i]−cnt[i][j])×f[i−1][k+1]
然后答案就是
a n s = ∑ i = 1 n f [ n ] [ i ] ans=\sum^{n}_{i=1}f[n][i] ans=i=1∑n​f[n][i]
这样我们就在 O ( n 2 ) O(n^2) O(n2)的时间复杂度内求出了不合法的方案数。
总方案数很好计算,第 i i i行有 s u m [ i ] sum[i] sum[i]种选择方案,再加上不选,所以总方案数就是
a l l = Π i = 1 n ( s u m [ i ] + 1 ) all=\Pi^{n}_{i=1}(sum[i]+1) all=Πi=1n​(sum[i]+1)
注意还要排除全部不选的情况。所以最终答案就是 a l l − a n s − 1 all-ans-1 all−ans−1。
时间复杂度 O ( m n 2 ) O(mn^2) O(mn2)。


代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;

const int N=110,M=2010,MOD=998244353;
ll ans,all,f[N][N+N],cnt[N][M],sum[N];
int n,m;

int main()
{
	scanf("%d%d",&n,&m);
	all=1;
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=m;j++)
		{
			scanf("%lld",&cnt[i][j]);
			sum[i]+=cnt[i][j];
		}
		all=((sum[i]+1)%MOD*all)%MOD;
	}
	for (int j=1;j<=m;j++)
	{
		f[0][N]=1;
		for (int i=1;i<=n;i++)
			for (int k=-n+N;k<=n+N;k++)
				f[i][k]=(f[i-1][k]+f[i-1][k-1]*cnt[i][j]+(sum[i]-cnt[i][j])%MOD*f[i-1][k+1])%MOD;
		for (int i=1;i<=n;i++)
			ans=(ans+f[n][i+N])%MOD;
	}
	printf("%lld",((all-ans-1)%MOD+MOD)%MOD);
	return 0;
}
1989:【19CSPS提高组】Emiya家今天的饭 c++noip完全AC代码(信奥赛昵称Kirito榜四可查),这题不算特别难,但也不简单,大概花了我两个小时左右吧。。。学习忙,没去别的平台上测试,请见谅 立即下载

相关推荐

新手必看:Infineon Memtools烧录配置全流程(附常见错误解决方案)

本文为嵌入式开发新手提供了Infineon AURIX开发环境搭建与Memtools烧录的全流程实战指南。详细解析了ADS、DAS和Memtools三大核心工具的角色与协同关系,并重点讲解了Memtools的图形界面配置步骤、烧录操作流程,以及针对“无法连接设备”、“编程失败”等常见错误的系统性排查与解决方案,帮助开发者快速上手并规避典型陷阱。

weixin_29189377的博客 634

P5664 [CSP-S2019] Emiya 家今天的饭

P5664 [CSP-S2019] Emiya 家今天的饭

GDW07的博客 2万+

Labview程序框架介绍

当掌握LabVIEW基础知识并达到,理解单个小型模块程序会相对轻松。而若想进一步探索大型程序,就必然需要了解程序框架相关内容。LabVIEW常用的程序架构包括等。在多年工作中,我接触过的众多高级工程师所开发的大型程序,基本都基于这些架构搭建。接下来,将为大家详细介绍这些框架。

Misterlhw的博客 4617

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

题目名称看样子灵感来自于日本动画片“卫宫家今天的饭”。 这道题的难度是“提高+/省选-”,算是提高组里比较难的。数据范围分的很细,解题方法跟数据范围关系比较大。对于新手来说,可以从数据范围入手,一步一步推导出最终的正解。 前8组数据,n不超过10,m等于2或3。可以直接用深度优先搜索暴力枚举所有的组合情况。 第9~16组数据,n为40,m仍然等于2或3。因为n比较大,若仍然用暴力枚举,则会超时。考...

小树学信奥 815

OFDM时频脉冲形状与子载波正交性的理解

从多载波调制的角度来理解子载波间正交,首先要明确OFDM默认的脉冲成型是时域矩形窗,时域上每个子载波 ej2πfnte^{j2πf_nt}ej2πfn​t 都被一个矩形窗脉冲gT(t)g_T(t)gT​(t)成型。其次,OFDM子载波间隔 等于 OFDM符号周期的倒数,这是子载波正交的条件。 ​ 根据时频脉冲形状,可以从时域上理解如左图(注意是矩形脉冲 乘 复指数),从频域上理解如右图(sinc脉冲 卷 频点)。 ​

weixin_43803202的博客 2213

保姆级教程:用GMT6.1绘制专业地形起伏图(从数据下载到出图避坑)

本文提供了一份详细的GMT6.1绘制地形起伏图的保姆级教程,从环境搭建到数据下载,再到核心绘图命令解析,帮助用户避开常见错误。特别适合科研人员和地理信息爱好者快速掌握专业地形图的绘制技巧,提升工作效率。

weixin_42549723的博客 275

Emiya 家今天的饭C++

考虑进一步优化,剪去无用状态:注意到在不合法情况的计算过程中,也就是fi,j,kfi,j,k​的转移过程中,我们实际上并不关心j,kj,k的具体数值,而只关心相对的大小关系;需要注意的是,所有只包含一道菜的方案都是不符合要求的,因为唯一的主要食材在超过一半的菜中出现,这不满足 Yazid 的要求。状态数O(n3)O(n3),转移O(1)O(1),算上枚举colcol,这一步复杂度是O(mn3)O(mn3)的。转移仍然是O(1)O(1)的,但总复杂度降为O(mn2)O(mn2),可以通过此题。

mwssx的博客 1206

别再手动巡检了!用Zabbix 5.0 + SNMPv2自动监控华为S系列交换机(附完整命令集)

本文详细介绍了如何利用Zabbix 5.0与SNMPv2实现华为S系列交换机的自动化监控,告别低效的手动巡检。通过配置SNMPv2c安全基线、核心功能启用及Zabbix Server端深度配置,构建7×24小时监控体系,实时预警接口状态、流量波动等关键指标,大幅提升运维效率与故障响应速度。

weixin_30940783的博客 628

洛谷P5664:Emiya 家今天的饭(容斥、dp)

解析 应该是比较入门的容斥了 统计方案用总方案数-某列超过1半的方案数 dp设计的一个trick是只统计差值 代码 #include<bits/stdc++.h> using namespace std; #define ll long long const int N=2050; const double eps=1e-6; const int mod=998244353; inline ll read(){ ll x=0,f=1;char c=getchar(); while

BUG_Creater_jie的博客 241

CentOS 9 Stream 上安装 MySQL 8.0+

根据提示进行设置,包括设置新的 root 密码、禁用远程 root 登录等。MySQL 在首次安装时会生成一个临时密码。这样就完成了 MySQL 8.0.37 的安装。这将安装最新的 MySQL 8.0 版本。

小强不是坑 1678

四阶龙格库塔法求解一次常微分方程组(python实现)

之前在博客发布了关于使用四阶龙格库塔方法求解一次常微分方程组的文章,由于代码缺少具体的验证,部分朋友可能存在疑问,因此这里打算再重新写一篇博客来验证一下程序的正确性,另外,这里是使用python语言来实现的。

HelloWorldTM的博客 8541

Luogu – P5664 – [CSP-S2019]Emiya家今天的饭

更好的阅读体验:TonyYin - Blog 题目地址:P5664 Emiya 家今天的饭 - 洛谷 | 计算机科学教育新生态 题意 一共 nnn 种烹饪方法和 mmm 种主要食材,每道菜对应一种方法和一种食材。使用第 iii 种方法和 第 jjj 种食材,可以做出 ai,ja_{i, j}ai,j​ 道不同的菜。求有多少个集合满足如下条件: 非空 每道菜烹饪方法互不相同 集合中每种主要食材的菜数不超过集合大小的一半 数据范围:n≤100,m≤2000n\leq 100, m\leq 2000n≤100

TonyYin's Blog 263

《大数据: Hive 交互命令和常用配置》

一、Hive 交互命令 1. 首先解决一个可能发生的问题 (log4 jar包冲突) 我这里解决方法就是删除一个,我删的是hive下的包 yexiang@hadoop1:<hive>$ hive SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/soft/apache-hive-2.3.7-bin/lib/log4j-slf4j-impl-2.6.2.ja.

yexiang优快云的专栏 287

【CSP2019】洛谷5664 Emiya家的饭题解(容斥+DP)

题目:luogu5664. 题目大意:给定一个nnn行mmm列的矩阵ai,ja_{i,j}ai,j​,选出一些位置满足: 1.至少选出一个位置. 2.每行只选一个数. 3.每一列选的位置数不能超过选的总位置数的一半. 求所有方案选出的数的乘积的和,不算一个都不选的方案. 1≤n≤100,1≤m≤20001\leq n\leq 100,1\leq m\leq 20001≤n≤100,1≤m≤2000...

hzk_cpp的博客 486

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

CSP-S 2019 真题 Emiya 家今天的饭 题解(提高+/省选-)

CSP-S 2019 真题「Emiya 家今天的饭」完整题解,考点提高+/省选-难度,含题意拆解、前置知识、逐段代码讲解、样例模拟与踩坑总结。

stillwatersss的博客 159

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

2019CSP-S D2T1Emiya家今天的饭(动态规划)

隔了(鸽了)半年多,重新回来做这道题,还是感觉很难… …果然蒟蒻还是蒟蒻… … https://www.luogu.com.cn/problem/P5664 **题意:**给一个n∗mn*mn∗m的矩阵,限制每行最多只能取一个点,每列所取的点数不能超过总点数的 12\frac{1}{2}21​ ,取的总点数不能为0,求总方案数。 32pts32pts32pts n≤10,m≤3n\le10,m\le3n≤10,m≤3 。 暴力枚举。 复杂度O(4n)O(4^n)O(4n) 。(3种菜+不选) //省掉了头文

sshs_ljh的博客 378

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

常用算法代码模板与题单 | E - 动态规划(更新于2026.10.7)

这篇文档其实是我自己学习路上的一份“复习笔记”。之前看了不少教程,零零散散记了一堆代码片段和小技巧,时间久了就容易忘,翻起来也麻烦。所以干脆花时间整理了一下,把常用的模板、容易踩的坑、还有一些个人觉得挺实用的小技巧都归到了一起。 如果你也在学类似的东西,或许能帮你省下一些翻找的时间;如果有哪里写得不清楚或不对,也欢迎随时指正交流。 希望这份整理也能对你有一点点帮助~ ✨

团爸讲算法 298

洛谷P5664 Emiya家今天的饭题解

讲解了一道经典的动态规划题目

KellerNOBODY的博客 940

洛谷 P5664 Emiya 家今天的饭 题解

纯暴力(32 pts) 开始的第一思路,可以过测试点1-8 直接枚举出每种烹饪方法所用的主要食材 用搜索枚举,传入两个参数:现在枚举的烹饪方法编号以及在此之前的方案数 代码: #include <iostream> #include <cstdio> const long long mod = 998244353 ; using namespace std ;...

xsaploser的博客 520

CSPS2019Day2T1(Emiya家今天的饭)题解

文章目录题目信息解题思路:dp代码实现 题目信息 题目传送门 解题思路:dp 对于一种做菜方案,至多只有一种主要食材在超过[k/2]道菜里出现过。所以我们可以用排除法,用总方案数 - 不合法方案数即可。 我们需要枚举主要食材,dp[i][j][k]代表前i种方式中包含j种食材,有k种烹饪方式未使用的方案数。 对于任意x,若x > [k / 2],则2x + n - k > n。 因此,可以将使用过某种食材的菜看作使用两次此食材,并为每种烹饪方式加一种每种食材都用过一次的菜。

风斯在下 505

NOIP2019提高组 day2

1.Emiya 家今天的饭 题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nnn 种烹饪方法,且会使用 mmm 种主要食材做菜。为了方便叙述,我们对烹饪方法从 1∼n1 \sim n1∼n 编号,对主要食材从 1∼m1 \sim m1∼m 编号。 Emiya 做的每道菜都将使用恰好一种烹饪方法与恰好一种主要食材。更具体地,Emiya 会做 ai,ja_{i,j}ai,j​ 道不同的使用烹饪方法 iii 和主要食材 jjj 的菜(1≤i≤n,1≤j≤m)(1 \leq i \leq n, 1 \leq

BetaCatiz的博客 718

CSP-S 2019————Emiya 家今天的饭————DP+思维

题解:本题主要考查DP+思维。 简要题意:一个矩阵,要求每行只选一个节点,每列选的节点不能超过所有选的节点的一半,不能不选,给出每个节点的选择方案数,求总方案数。 1.DP+思维: (1).维护每列已选的节点复杂度太大,应该不行,所以先不考虑每列不超过一半,求出总数,再减去不合法的方案数,应用逆向思维转换问题。 (2).设dp[i][j][k]dp[i][j][k]dp[i][j][k]​表示前i...

wly1127的博客 718

Emiya 家今天的饭(CSP 2019 D2 T1)

题目 题目描述 Emiya 是个擅长做菜的高中生,他共掌握nn种烹饪方法,且会使用mm种主要食材做菜。为了方便叙述,我们对烹饪方法从1 \sim n1∼n编号,对主要食材从1 \sim m1∼m编号。 Emiya 做的每道菜都将使用恰好一种烹饪方法与恰好一种主要食材。更具体地,Emiya 会做a_{i,j}ai,j​道不同的使用烹饪方法ii和主要食材jj的菜(1 ...

weixin_43823476的博客 654

Emiya 家今天的饭

看这篇题解 能学到挺多东西的。 首先是容斥原理,我们看到了序列题不超过一半,可以往这上面想,因为一定不会有两种元素同时超过一半 然后就是DP,我们在这种情况下的DP一般都是预处理,但是这道题目是每次都要枚举不合法的列\(col\)进行DP,所以思维不要被限制了 最后是DP的优化。这是我第一次见到通过观察最后的求式来优化DP的。观察最后的和式,我们发现我们只关心\(j>k\)的情况,所以可以...

dingxingdi的博客 463

CSP day2

Emiya 家今天的饭 题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nnn 种烹饪方法,且会使用 mmm 种主要食材做菜。为了方便叙述,我们对烹饪方法从 1∼n1 \sim n1∼n 编号,对主要食材从 1∼m1 \sim m1∼m 编号。 Emiya 做的每道菜都将使用恰好一种烹饪方法与恰好一种主要食材。更具体地,Emiya 会做 ai,ja_{i,j}ai,j​ 道不同的使用烹饪方法...

weixin_44351585的博客 510
上一篇: 【CSP-S 2019】【洛谷P5658】括号树【dfs】【二分】
下一篇: 【洛谷P5068】我回来了【bfs】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值