CSP-S 2019 Emiya 家今天的饭

\(\text {Emiya 家今天的饭}\)

Emiya 不会让大家饿肚子,所以将做至少一道菜,即 \(k\geq1\)
Rin 希望品尝不同烹饪方法做出的菜,因此她要求每道菜的烹饪方法互不相同
Yazid 不希望品尝太多同一食材做出的菜,因此他要求每种主要食材至多在一半的菜(即\(?k /2?\)道菜)中被使用

subtask1 \(\text {期望得分 64pts}\)

\(f[i][j][k][l]\)\(j, k, l\)分别表示每一列选多少数就行了

subtask2 \(\text {期望得分 84pts}\)

考虑到有且只有一列所选的东西会大于\(?k /2?\)个 即不满足条件

我们可以用容斥定理 用所有情况-不满足条件情况就行了

我们先钦定\(t\) 为选数最多的一列 \(f[i][j][k]\)表示选到了第\(i\)行最多的一行用了\(j\)个 其余列总共选了\(k\)个 答案不满足条件 当切仅当\(j > k\)

转移比较容易
\[f[i][j][k] = f[i - 1][j][k] + f[i - 1][j - 1][k] * a[i][t] + f[i - 1][j][k - 1] *(s[i] - a[i][t])\]

for (int t = 1; t <= m; t ++ ) {
    memset (f, 0, sizeof (f));
    f[0][0][0] = 1;
    for (int i = 1; i <= n; i ++ ) {
        for (int j = 0; j <= i; j ++ ) {
            for (int k = 0; k <= i - j; k ++ ) {
            f[i][j][k] = f[i - 1][j][k];
            if (j) Add (f[i][j][k], f[i - 1][j - 1][k] * a[i][t] % mod);
            if (k) Add (f[i][j][k], f[i - 1][j][k - 1] % mod * (s[i] % mod - a[i][t] % mod + mod) % mod);
            f[i][j][k] %= mod;
            }
        }
    }
    for (int i = 1; i <= n; i ++ )
        for (int j = 0; j <= n - i; j ++ )
            if (i > j) Add(wrong, f[n][i][j]);
}

时间复杂度\(O(n^3 *m)\)

std \(\text {期望得分 100pts}\)

考虑如何优化\(f[i][j][k]\)可以直接用差值优化一下

\(f[i][j - k]\)表示选到第几行 最多的一行减去其他行的值为\(j - k\)

考虑\(j - k\)可能为负数 所以我们可以集体向右移\(n\) 然后就行了

\[f[i][j] = f[i -1][j] + f[i - 1][j + 1] * a[i][t] + f[i - 1][j - 1]*(s[i]-a[i][t])\]

int main () {
    read (n); read (m);
    ll ans = 1;
    for (int i = 1; i <= n; i ++ ) for (int j = 1; j <= m; j ++ ) read (a[i][j]), s[i] += a[i][j], s[i] %= mod;
    for (int i = 1; i <= n; i ++ ) ans = (ans * (s[i] + 1)) % mod;
    for (int t = 1; t <= m; t ++ ) {
        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 ++ ) {
                Add (f[i][j], (f[i - 1][j] + f[i - 1][j + 1] * (s[i] - a[i][t]) % mod) % mod);
                if (j >= 1) Add (f[i][j], f[i - 1][j - 1] * a[i][t] % mod);
            }
        }
        for (int i = n + 1; i <= n * 2; i ++ ) Add (wrong, f[n][i]);
    }
    write ((ans % mod - wrong % mod + mod - 1 + mod) % mod);
    return 0;
}

分析

\(64\)难度不大 考场上心态不炸很好拿 难度普及+

\(84\)分需要分析性质 难度提高

\(84->100\)需要经过思考 难度提高+

原文地址:https://www.cnblogs.com/Hock/p/12213110.html

时间: 2024-10-08 16:40:46

CSP-S 2019 Emiya 家今天的饭的相关文章

【JZOJ6433】【luoguP5664】【CSP-S2019】Emiya 家今天的饭

description analysis 首先可以知道不符合要求的食材仅有一个,于是可以容斥拿总方案数减去选不合法食材的不合法方案数 枚举选取哪一个不合法食材,设\(f[i][j]\)表示到第\(i\)种烹饪方法.操作权值为\(j\)的方案数 给每一个操作赋权值,选当前行合法食材列为\(0\),不选当前行为\(1\),选当前行不合法食材列为\(2\) 转移是比较容易的,可知选当前列为不合法食材的方案数就是\(\sum_{i=n+1}^{2n}f[n][i]\) code #include<std

csp2019 Emiya家今天的饭题解

qwq 由于窝太菜了,实在是不会,所以在题解的帮助下过掉了这道题. 写此博客来整理一下思路 正文 传送 简化一下题意:现在有\(n\)行\(m\)列数,选\(k\)个数的合法方案需满足: 1.一行最多选一个 2.一列最多选\(\lfloor \frac{k}{2} \rfloor\)个数 当然,如果你在某一行里选了0,就相当于没有在这一行里选数 选一次对答案的贡献是你选的所有不为零的数的乘积.对于任意的\(k\),只要有合法方案,就能取. (希望没有把题目变得更复杂叭) 根据上面的要求,我们发现

CSP2019 Emiya 家今天的饭

Description: 有 \(n\) 中烹饪方法和 \(m\) 种食材,要求: 至少做一种菜 所有菜的烹饪方法各不相同 同种食材的菜的数量不能超过总菜数的一半 求做菜的方案数. Solution1:考虑 DP 先容斥一下,答案为忽略第三个条件所得的方案数减去每一种食材超过一半的方案数之和. 忽略掉第三个条件之后答案显然是 \[ \prod_{i=1}^n(1+\sum_{j=1}^m a_{i,j})-1 \] 减去 1 是去掉一道菜都不做的方案. 枚举每一列超过一半的情况,显然,除这一列外

@CSP模拟2019.10.16 - [email&#160;protected] 垃圾分类

目录 @[email protected] @[email protected] @accepted [email protected] @[email protected] @[email protected] 为了保护环境,p6pou建设了一个垃圾分类器. 垃圾分类器是一个树形结构,由 n 个垃圾桶和 n-1 条双向传送带组成. 垃圾处理器的编号为 1, 2, ..., n,每条传送带都可以花 1 秒钟将垃圾从一个垃圾桶输送到另一个垃圾桶. 垃圾投放点是编号为 r 的垃圾桶,垃圾总是投放在这

CSP2019题解

按照CSP题目顺序来写 格雷码 不难发现答案可以递归找到,然后每一次做即可. 代码 括号树 简单题,直接在树上搞一个栈然后回溯即可. 括号树nmsl 代码 树上的数 咕咕咕 Emiya 家今天的饭 很显然可以看出这题可以容斥,然后就可以写一个\(O(mn^3)\)的\(dp\). 然后考虑后面那两维状态可以做一个差,这样子就优化成了\(O(2mn^2)\),然后就可以过了. 代码 划分 \(\texttt{__int128}\)不香吗 代码 树的重心 代码 原文地址:https://www.cn

CSP2019 题解

CSP2019 题解 D1T1 格雷码(code) 题目传送门 https://loj.ac/problem/3208 题解 按照题意模拟就可以了. 对于第 \(i\) 位,如果 \(k \geq 2^i\) 那么这一位就是 \(1\),然后把 \(k\) 变成 \(2^{i + 1} - k - 1\).否则这一位为 \(0\),\(k\) 不变. 代码 https://loj.ac/submission/687508 D1T2 括号树(brackets) 题目传送门 https://loj.

CSP2019复赛游记

目录 Day -1 Day 0 Day 1 考前 考中 考后 做法&程序(考场做法,不能AC) 格雷码 括号树 树上的数 Day 2 考前 考中 考后 做法&程序(考场做法,不能AC) Emiya 家今天的饭 划分 树的重心 Day 3+(后记&提醒) date: 2019-11-15 前言:想直接进入正题请跳转到Day 1. Day -1 明天我就去南京了,感到非常的紧张,毕竟CSP和NOIP没有关系,没有真题可以刷(逃. 注:对于内心中难度的比较,是对于NOIP提高组的题目比较

CSP-J/S2019试题选做

小蒟蒻duyi CSP爆炸之后一直在颓,所以直到最近才陆续订正完CSP的题/kel 以后不能这么颓了(flag) S D1T2 括号树 设\(f[u]\)表示根到\(u\)的路径上有多少子串是合法括号串.(即题目里的\(k_u\),此变量名缺乏个性,故换之) 从根向每个节点dfs,容易求出\(c[u]\):表示从根到\(u\)的路径上,我们能匹配则匹配,最后剩下多少个待匹配的左括号. 例如如下\(s_u\)对应的\(c[u]\): ((() \(c[u]=2\). (())( \(c[u]=1\

张书乐:想在中国开149家店,宜家的肉丸生意快做不下去了

在后流量时代,宜家对更多场景的渴望,已经不是一个店面能包容的了.它不得不依托巨大的线下人流,寻找更多市场红利. 文/张书乐 刊载于<商界评论>2017年2月刊 据宜家家居公布的2016财年报告显示,宜家集团总收入达351亿欧元,比上年增长了7.4%:宜家中国销售额超过125亿人民币,比于去年增长了18.9%.宜家集团今年全球商场共计迎来7.83亿人次的到访,而宜家中国每分钟就会迎来339位顾客,比去年增加20%.在该公司全球28个市场中,中国增长最快. 一连串利好的上扬数据,尤其是在中国市场的