题目

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

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≤m1 \leq i \leq n, 1 \leq j \leq m1≤i≤n,1≤j≤m),这也意味着 Emiya 总共会做 ∑i=1n∑j=1mai,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 这对好朋友,然而三个人对菜的搭配有不同的要求,更具体地,对于一种包含 kkk 道菜的搭配方案而言:

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

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

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

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


思路:

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

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

  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-S 2019 D2 T1】P5664 Emiya 家今天的饭

    HyperlinkHyperlinkHyperlink https://www.luogu.com.cn/problem/P5664 DescriptionDescriptionDescription ...

  4. 2019 CSP-S Day2 T1 Emiya 家今天的饭(DP)

    题目 Description Input Output 输出到文件 meal.out 中. 仅一行一个整数,表示所求方案数对 998, 244, 353 取模的结果. Sample Input Sam ...

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

    题解:本题主要考查DP+思维. 简要题意:一个矩阵,要求每行只选一个节点,每列选的节点不能超过所有选的节点的一半,不能不选,给出每个节点的选择方案数,求总方案数. 1.DP+思维: (1).维护每列已 ...

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

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

  7. NOIP2019 Emiya家今天的饭

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

  8. [洛谷 1365] WJMZBMR打osu! / Easy {期望DP}

    题目 https://www.luogu.org/problemnew/show/P1365 解题思路 这是我做的第三道期望DP.跟前两道的不同之处,在于它连续的一段具有不确定性且没有给出n的范围.所 ...

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

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

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

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

最新文章

  1. XSS学习-初出茅庐
  2. 【浅谈】如何做好一名初级技术面试官
  3. 系统架构师学习笔记_第三章_连载
  4. 第一个python去掉行号
  5. Python执行 SQL 命令并实时打印输出
  6. IOS UIPageControl的设置点为一张图片
  7. Oracle命令--alter 操作
  8. GPS、GNSS、NB-IOT介绍
  9. Xorg可以使用hot-plug了,不过配置很麻烦
  10. python 基于滑动平均思想实现缺失数据填充
  11. AdBlock插件离线安装
  12. 用户名枚举/邮箱轰炸攻击
  13. r library car_R 语言教程:方差分析与多重比较
  14. STM32F1 HAL库实战开发——【实验1 点亮LED实验】
  15. MTK: LSK,RSK的标签与响应
  16. 锻造宝剑!如何用一款手机打造一个移动渗透工具箱??
  17. 值得重视的网络安全问题
  18. mysql将多行结果合并
  19. c语言实现登录注册功能
  20. JavaScript:利用JavaScript实现的功能、算法和奇淫技巧(持续更新)

热门文章

  1. Jmeter插件duang duang duang 学会模拟各种场景
  2. kinit: Keytab contains no suitable keys for xxxx@HADOOP.COM while getting initial credentials
  3. A configuration error occurred during startup. Please verify the preference fiel
  4. s2系列——s2-005复现
  5. 从高考状元,到中科院最年轻博导!她拿下这一国际大奖,中国首个!
  6. html浏览标签页性恋比例,聊聊Dom与Sub的构成比例与现状
  7. 安装mysql odbc重启mssql_关于php连接mssql:pdo odbc sql server
  8. jsp蔬菜水果的网上购物系统
  9. 智能硬件,让撩妹更高端
  10. 计算机大赛颁奖大会,我院举行首届计算机操作员大赛颁奖大会