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. CTF-misc:老板,再来几道misc玩玩

    [BJDCTF 2nd]最简单的misc-y1ng 得到一个图片,提示格式损坏,修补一下文件头 然后得到一张图片 直接python16进制转字符串 >>> string = &quo ...

  2. Redis集群环境搭建实践

    0 Redis集群简介 Redis集群(Redis Cluster)是Redis提供的分布式数据库方案,通过分片(sharding)来进行数据共享,并提供复制和故障转移功能.相比于主从复制.哨兵模式, ...

  3. 01 . Go之Gin+Vue开发一个线上外卖应用

    项目介绍 我们将开始使用Gin框架开发一个api项目,我们起名为:云餐厅.如同饿了么,美团外卖等生活服务类应用一样,云餐厅是一个线上的外卖应用,应用的用户可以在线浏览商家,商品并下单. 该项目分为客户 ...

  4. Django之富文本(获取内容,设置内容)

    富文本 1.Rich Text Format(RTF) 微软开发的跨平台文档格式,大多数的文字处理软件都能读取和保存RTF文档,其实就是可以添加样式的文档,和HTML有很多相似的地方 图示 2.tin ...

  5. C# 泛型的协变

    class Program { static void Main(string[] args) { Person person = new Person(); Person chinese2 = ne ...

  6. LWJGL3的内存管理,第三篇,剩下的两种策略

    LWJGL3的内存管理,第三篇,剩下的两种策略 上一篇讨论的基于 MemoryStack 类的栈上分配方式,是效率最高的,但是有些情况下无法使用.比如需要分配的内存较大,又或许生命周期较长.这时候就可 ...

  7. Dcoker 安装 rabbitMq

    使用Docker安装部署RabbitMQ   1.docker search rabbitmq:management     2.docker pull rabbitmq:management     ...

  8. CF1295E Permutation Separation

    线段树 难得把E想出来,写出来,但却没有调出来(再给我5分钟),我的紫名啊,我一场上紫的大好机会啊 首先考虑是否能将$k$在$1$--$n-1$的每一个的最小代价都求出来 因为$k$从$i$到$i-1 ...

  9. PhpExcel PhpSpreadsheet 锁定单元格 正确做法!!

    首先声明 PhpExcel 已经停止更新,转而代之的是 PhpSpreadsheet : 但是 !!不必担心 PhpSpreadsheet 包含了大部分的 PhpExcel 的功能 : //code ...

  10. Java 中数组转换为 List

    目录 1 - int 型数组转换为 List 2 - List 转换为 int 型数组 3 - String 型数组转换为 List 4 - List 转换为 String 型数组 版权声明 开发中经 ...