【题解】洛谷P4707重返现世
在跨年的晚上玩手机被妈妈骂了赶来写题……呜呜呜……但是A题了还是很开心啦,起码没有把去年的题目留到明年去做ヾ(◍°∇°◍)ノ゙也祝大家2019快乐!
这题显然的 kth min-max 容斥就不说了,不会的还是百度吧……记录一下后面的 dp。感觉挺强强的,%题解……
首先,min - max 容斥的公式为 : \(max_{K}(S) = \sum_{T\subseteq S}(-1)^{|T|-K}\binom{|T|-1}{K-1}min(T)\)
但是最后面的 \(min(T)\) 显然不能 \(2 ^ {n}\) 枚举,但又是非线性的求和。所以我们需要一点不一样的dp……考虑到 \(n - K <= 10\),实际上也就是说在上面公式中出现的 \(\binom{|T| - 1}{K - 1}\) 中的 \(K - 1\) 最大不会超过 11。从这个地方入手,设 在前 \(x\) 个元素组成的集合中, \(g_{x, i, j}\) 为所有 \(min(T) = j\) 且 \(|T| = i\) 的子集的方案数,
而\(f_{x, j, k} = \sum_{i = 1}(-1)^{i - k}\binom{i - 1}{k - 1}*g_{x, i, j}\)
考虑向集合中加入第 \(i\) 个元素,不加入的直接继承上一次的。
加入的则需要分析一下(下面的就只讨论包含第 \(i\) 个元素的情况)
考虑从 \(f_{x - 1, j - v, k - 1}\) 转移过来(\(v\) 为 \(p[i]\))
分析:\(f_{x - 1, j - v, k - 1} = \sum_{i = 1}(-1)^{i - k + 1}\binom{i - 1}{k - 2}*g_{x - 1, i, j - v}\)
为了便于观察,我们尽量把 \(f_{x, j, k}\) 也写成一样的形式
\(f_{x, j, k} = \sum_{i = 1}(-1)^{i - k + 1}\binom{i}{k - 1}*g_{x - 1, i, j - v}\)
因为我们有 \(\binom{n}{m} = \binom{n - 1}{m}+\binom{n - 1}{m - 1}\)
所以 \(f_{x, j, k} - f_{x - 1, j- v, k - 1} = \sum_{i = 1}(-1)^{i - k + 1}\binom{i - 1}{k - 1}*g_{x, i, j - v} = -f_{x - 1, j - v, k}\)
所以,完整的式子是:
\(f_{x, j, k} = f_{x - 1, j, k} + f_{x - 1, j - v, k - 1} - f_{x - 1, j - v, k}\)
这样就可以愉快地递推啦。不过还有一个小小的细节,就是边界的问题。我们只需要每次保存 \(f_{x, 0, 0} = 1\) 即可,因为会从 \(0\) 转移出去的当且仅当 \(v = j\) 即集合中仅有一个元素时。此时显然有 \(f_{x, p[x], 1} = 1\)。
#include <bits/stdc++.h>
using namespace std;
#define maxn 2005
#define maxm 20000
#define mod 998244353
#define int long long
int n, K, m, f[][maxm][];
int ans, now, pre, p[maxn];
int inv[maxm], finv[maxm], fac[maxm]; int read()
{
int x = , k = ;
char c; c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void Up(int &x, int y) { x = (x + y) % mod; if(x < ) x += mod; }
void init()
{
fac[] = , inv[] = inv[] = ; finv[] = ;
for(int i = ; i < maxm; i ++) fac[i] = fac[i - ] * i % mod;
for(int i = ; i < maxm; i ++) inv[i] = (mod - mod / i) * inv[mod % i] % mod;
for(int i = ; i < maxm; i ++) finv[i] = finv[i - ] * inv[i] % mod;
} int C(int n, int m)
{
if(n < m || n < || m < ) return ;
return fac[n] * finv[m] % mod * finv[n - m] % mod;
} int Qpow(int x, int timer)
{
int base = ;
for(; timer; timer >>= , x = x * x % mod)
if(timer & ) base = base * x % mod;
return base;
} void DP()
{
now = , pre = ; f[pre][][] = ;
for(int i = ; i <= n; i ++, swap(now, pre), f[pre][][] = )
for(int j = ; j <= m; j ++)
for(int k = ; k <= K; k ++)
{
f[now][j][k] = f[pre][j][k];
if(j < p[i]) continue;
Up(f[now][j][k], f[pre][j - p[i]][k - ]);
Up(f[now][j][k], -f[pre][j - p[i]][k]);
}
} signed main()
{
n = read(), K = read(), m = read(); init();
for(int i = ; i <= n; i ++) p[i] = read();
K = n - K + ; DP();
for(int i = ; i <= m; i ++)
Up(ans, f[pre][i][K] * m % mod * inv[i] % mod);
printf("%lld\n", ans);
return ;
}
【题解】洛谷P4707重返现世的更多相关文章
- 洛谷 P4707 重返现世
洛谷 P4707 重返现世 k-minimax容斥 有这一个式子:\(E(\max_k(S))=\sum_{T\subseteq S}(-1)^{|T|-k}C_{|T|-1}^{k-1}\min(T ...
- 洛谷P4707 重返现世(扩展MinMax容斥+dp)
传送门 我永远讨厌\(dp.jpg\) 前置姿势 扩展\(Min-Max\)容斥 题解 看纳尔博客去→_→ 咱现在还没搞懂为啥初值要设为\(-1\)-- //minamoto #include< ...
- [洛谷P4707] 重返现世
Description 为了打开返回现世的大门,\(Yopilla\) 需要制作开启大门的钥匙.\(Yopilla\) 所在的迷失大陆有 \(n\) 种原料,只需要集齐任意 \(k\) 种,就可以开始 ...
- 洛谷P4707 重返现世 [DP,min-max容斥]
传送门 前置知识 做这题前,您需要认识这个式子: \[ kthmax(S)=\sum_{\varnothing\neq T\subseteq S}{|T|-1\choose k-1} (-1)^{|T ...
- 洛谷 P4707 - 重返现世(扩展 Min-Max 容斥+背包)
题面传送门 首先看到这种求形如 \(E(\max(T))\) 的期望题,可以套路地想到 Min-Max 容斥 \(\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T| ...
- 题解 洛谷P5018【对称二叉树】(noip2018T4)
\(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- 题解-洛谷P4229 某位歌姬的故事
题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...
随机推荐
- TensorFlow Python2.7环境下的源码编译(一)环境准备
参考: https://blog.csdn.net/yhily2008/article/details/79967118 https://tensorflow.google.cn/install/in ...
- 4星|《钱的历史》:大英博物馆的钱币简史,彩图众多不适合在kindle上阅读
钱的历史(大英博物馆权威出品,一部金钱简史) 大英博物馆的两位钱币馆馆长的作品.非常专业.基本是世界钱币简史.从钱币的发展变迁讲到涉及到的历史大事,重心当然是欧洲的钱币史,中国.印度也各安排了一章. ...
- 解决k8s出现pod服务一直处于ContainerCreating状态的问题的过程
参考于: https://blog.csdn.net/learner198461/article/details/78036854 https://liyang.pro/solve-k8s-pod-c ...
- 基于Neutron的Kubernetes SDN实践经验之谈
首先,向大家科普下Kubernetes所选择的CNI网络接口,简单介绍下网络实现的背景. CNI即Container Network Interface,是一套容器网络的定义规范,包括方法规范.参数规 ...
- Kubernetes探索学习001--Centos7.6使用kubeadm快速部署Kubernetes集群
Centos7.6使用kubeadm快速部署kubernetes集群 为什么要使用kubeadm来部署kubernetes?因为kubeadm是kubernetes原生的部署工具,简单快捷方便,便于新 ...
- Daily Scrum (2015/11/3)
今天我们的爬虫能在pc上成功运行并且把所爬取的数据存到服务器上了!我们已经搭建好数据库,把相关信息存到数据库中,并把数据存到D盘里共享给数据处理小组使用. 成员 今日工作 时间 明日工作 符美潇 完成 ...
- BETA-3
前言 我们居然又冲刺了·三 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 过去两天完成了哪些任务 一堆deadline截至前的两天,为了图形学和编译原理毅然决然地放弃冲刺 接下 ...
- Alpha版本冲刺(二)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内 ...
- 项目总结之关于JQuery一些常用的函数
最近做一个小的项目,用到了很多关于jquery函数,下面简单总结下自我感觉比较常用的一些函数. jquery函数--Hide函数用法 jquery中,hide函数用于实现层的消失,相反,show函数用 ...
- js汉字按字母排序
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...