description

loj 3211

solution

看到题目中要求每种主要食材至多在一半的菜中被使用,容易想到补集转换。

即\(ans=\)总方案数-存在某一种食材在一半以上的菜中被使用的方案。

总方案数很容易求:即对于每一种烹饪方法选至多一道菜的方案为\(s_i+1\),其中\(s_i=\sum_{j=1}^{m} a_{i,j}\)。

故总方案数\(=\prod_{i=1}^{n} (s_i+1)-1\),其中-1是因为要去掉一道菜都没有选的方案。

而不合法的方案,我们可以先钦定第\(w\)列中选出了一半以上的数,于是可以用\(f_{i,j,k}\)表示前\(i\)行中已经在第\(w\)列选了\(j\)个数,在其他列选了\(k\)个数的方案。于是有:

\[f_{i,j,k}=f_{i-1,j,k}+a_{i,w}*f_{i-1,j-1,k}+(s_i-a_{i,w})*f_{i-1,j,k-1}
\]

于是答案就是所有满足\(j>k\)的\(f_{n,j,k}\)的和,可以$O(mn^3)做。

考虑优化,事实上我们一直只关心\(j-k\)的大小,于是可以将状态改为\(f_{i,j}\)表示前\(i\)行中,第\(w\)列比其他列多选\(j\)个数的方案。于是有:

\[f_{i,j}=f_{i-1,j}+a_{i,w}*f_{i-1,j-1}+(s_i-a_{i,w})*f_{i-1,j+1}
\]

于是答案就是\(\sum_{i=1}^{n} f_{n,i}\),就可以\(O(mn^2)\)完成,可以通过此题。

为了防止出现负数下标,可以将下标整体加\(n\)

code

#include<cstdio>
#include<cstring>
const int mod=998244353;
const int N=210;
int a[N][2010],s[N],tot=1,bad,n,m,f[N][N];
int add(int x,int y){return (x+y>=mod)?x+y-mod:x+y;}
int dec(int x,int y){return (x-y<0)?x-y+mod:x-y;}
int main(){
freopen("meal.in","r",stdin);
freopen("meal.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j) scanf("%d",&a[i][j]),s[i]=add(s[i],a[i][j]);
tot=1ll*tot*(s[i]+1)%mod;
}
for(int w=1;w<=m;++w){
std::memset(f,0,sizeof(f));
f[0][n]=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]=add(f[i][j],1ll*f[i-1][j-1]*a[i][w]%mod);
f[i][j]=add(f[i][j],1ll*f[i-1][j+1]*dec(s[i],a[i][w])%mod);
}
}
for(int i=n+1;i<=n+n;++i)tot=dec(tot,f[n][i]);
}
printf("%d\n",dec(tot,1));
return 0;
}

「CSP-S 2019」Emiya 家今天的饭的更多相关文章

  1. [CSP-S 2019 Day2]Emiya家今天的饭

    思路: 这种题目就考我们首先想到一个性质.这题其实容易想到:超限的菜最多只有一个,再加上这题有容斥那味,就枚举超限的菜然后dp就做完了. 推式子能力还是不行,要看题解. 式子还需要一个优化,就是废除冗 ...

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

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

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

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

  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. LOJ#6713. 「EC Final 2019」狄利克雷 k 次根 加强版

    题目描述 定义两个函数 \(f, g: \{1, 2, \dots, n\} \rightarrow \mathbb Z\) 的狄利克雷卷积 \(f * g\) 为: \[ (f * g)(n) = ...

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

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

  8. 「LOJ 3153」 「JOI Open 2019」三级跳

    题面 LOJ 3153 solution 对于任意一对\(A,B\),若区间\([A,B]\)中存在一个数权值大于\(A\)或\(B\),则用这个数来替代\(A\)或\(B\)显然更优. 故只需要考虑 ...

  9. CSP-S 2019 Emiya 家今天的饭

    64 pts 类似 乌龟棋 的思想,由于 \(64pts\) 的 \(m <= 3\), 非常小. 我们可以设一个 \(dp\),建立 \(m\) 个维度存下每种物品选了几次: \(f[i][A ...

随机推荐

  1. python fastApi实战项目 - 爱投票管理系统(一)

    一.闲来无事,在工作之余自己研究了一下python的异步框架 - fastapi,并写包括 1.部门管理 2.角色管理 3.用户管理 4.菜单管理 5.登录日志 6.操作日志 六个基础功能模块,演示链 ...

  2. vue 用别名取代路径引用

    在项目开发过程中有可能很多包是没有放在npm上的,许多包需要下载到本地引用,这样一来我们只能通过require的方式来引用文件,但是路径的名字就会很长 例如 import Select from '. ...

  3. JavaScript 正则表达式:字符串中查找数字

    以下代码是在一段字符串中,用正则表达式找到数字,使用 replace() 方法,用找到的数字的两倍值替换原数字.replace() 方法的第二个参数为一个函数,返回找到数字的两倍值. <scri ...

  4. .net npoi读word内容+目录

    最近在做读npoi文档存入搜索引擎,实现快速查询word文档中内容并展示,效果希望带有目录导航. 网上有很多例子都是读写操作,很肤浅没有具体读到想要的东西所以自己就写了个demo,也有微软提供的off ...

  5. Python + Appium 自动化操作微信入门看这一篇就够了

    简介 Appium 是一个开源的自动化测试工具,支持 Android.iOS 平台上的原生应用,支持 Java.Python.PHP 等多种语言. Appium 封装了 Selenium,能够为用户提 ...

  6. JavaMail 发送邮件出现 Connection reset 问题

    问题描述 使用 java mail 发送邮件的时候,申请的 163 邮箱作为发件箱,然无论如何配置,均出现 Connection reset,无法正常发送邮件. Exception in thread ...

  7. Java_数组, 懒得整理了 ---------------------> 未完, 待续

    待续 public class TestArray { public static void main(String[] args) { String[] s1 = {"双儿", ...

  8. Python学习笔记1:基础

    1.编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 你也可以为源文件指定不同的字符编码.在 #! 行(首行)后插入至少一行特殊的注释行来定义 ...

  9. 使用RD Client来远程桌面

    使用RD Client来远程桌面 可能你会觉得奇怪,team viewer和向日葵之类的难道不香吗?看起来他们两个都是实现了远程桌面的功能,好像没必要特地用Windows自带的RD Client进行内 ...

  10. Linux系统下用户如何膝盖FTP用户密码

    其实修改ftp用户密码与修改普通用户的密码的过程是一眼高的其具体步骤如下 1.用root账户登录系统 2.使用passwd命令修改密码: 第一次输入密码后提示:The password fails t ...