Luogu4707 重返现世 min-max容斥、DP
kthMinMax的唯一模板?
首先你需要知道kth Min-Max定理的内容:\(kthmax(S) = \sum\limits_{T \subseteq S} (-1)^{|T| - k} \binom{|T| - 1}{k - 1}min(T)\),证明与二项式反演相关,而且比较有趣的一件事情是这个定理也可以推广到期望上。
因为\(|n-k| \leq 10\),所以我们把求第\(k\)小改为第\(k\)大,那么就有\(k \leq 11\)。
那么我们就只需要支持快速的求出所有满足\(|T| \geq k\)的\(S\)的子集的贡献。这个显然不能直接枚举,考虑DP。
设\(f_{i,j,k}\)表示考虑了前\(i\)个物品,\(\sum\limits_{T \subseteq [1,i] , \sum\limits_{x \in T} p_x = j} (-1)^{|T| - k} \binom{|T| - 1}{k - 1}\)的值。转移有两种情况:
1、第\(i\)个物品不选,从\(f_{i-1,j,k}\)转移;
2、选择第\(i\)个物品,那么
\(\begin{align*}f_{i,j,k} += & \sum\limits_{T \subseteq [1,i-1] , \sum\limits_{x \in T} p_x = j - p_i} (-1)^{|T|+1-k} \binom{|T|}{k-1} \\ = & \sum\limits_{T \subseteq [1,i-1] , \sum\limits_{x \in T} p_x = j - p_i} (-1)^{|T|+1-k} (\binom{|T| - 1}{k - 1} + \binom{|T - 1|}{k - 2}) \\ = & -\sum\limits_{T \subseteq [1,i-1] , \sum\limits_{x \in T} p_x = j - p_i} (-1)^{|T| - k} \binom{|T| - 1}{k - 1} + \sum\limits_{T \subseteq [1,i-1] , \sum\limits_{x \in T} p_x = j - p_i} (-1)^{|T| - (k - 1)} \binom{|T| - 1}{k - 2} \\ =& f_{i-1,j-p_i,k-1} - f_{i-1,j-p_i,k} \end{align*}\)
所以\(f_{i,j,k} = f_{i-1,j,k} + f_{i-1,j-p_i,k-1} - f_{i-1,j-p_i,k}\)
值得注意的是初值。当\(j=0\)或者\(k=0\)的时候应该所有的dp值都是\(0\),但是注意到转移\(f_{i,p_i,1}\)的时候,我们可以在空集中加入\(i\)号元素产生\(1\)的贡献,也就是说\(f_{x,0,0} (x \in [0 , N]) =1\),其他的都是\(0\)。
最后枚举集合\(T\)的元素和就可以求出答案了。
#include<bits/stdc++.h>
//this code is written by Itst
using namespace std;
#define int long long
const int MOD = 998244353;
int dp[2][10003][15] , N , M , K , p[1003] , inv[10003];
signed main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
//freopen("out","w",stdout);
#endif
cin >> N >> K >> M; K = N - K + 1;
dp[0][0][0] = 1; int now = 0;
for(int i = 1 ; i <= N ; ++i){
cin >> p[i];
now ^= 1; memset(dp[now] , 0 , sizeof(dp[0]));
dp[now][0][0] = 1;
for(int j = 1 ; j <= M ; ++j)
for(int k = 1 ; k <= K ; ++k)
dp[now][j][k] = (dp[now ^ 1][j][k] + (j >= p[i] ? dp[now ^ 1][j - p[i]][k - 1] - dp[now ^ 1][j - p[i]][k] + MOD : 0)) % MOD;
}
inv[1] = 1;
for(int i = 2 ; i <= M ; ++i) inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;
int ans = 0;
for(int i = 1 ; i <= M ; ++i) ans = (ans + dp[now][i][K] * inv[i]) % MOD;
cout << ans * M % MOD;
return 0;
}
Luogu4707 重返现世 min-max容斥、DP的更多相关文章
- P4707 重返现世 扩展 MinMax 容斥+DP
题目传送门 https://www.luogu.org/problem/P4707 题解 很容易想到这是一个 MinMax 容斥的题目. 设每一个物品被收集的时间为 \(t_i\),那么集齐 \(k\ ...
- 【Luogu4707】重返现世(min-max容斥)
[Luogu4707]重返现世(min-max容斥) 题面 洛谷 求全集的\(k-max\)的期望 题解 \(min-max\)容斥的证明不难,只需要把所有元素排序之后考虑组合数的贡献,容斥系数先设出 ...
- Luogu P4707 重返现世 (拓展Min-Max容斥、DP)
题目链接 https://www.luogu.org/problem/P4707 题解 最近被神仙题八连爆了-- 首先Min-Max容斥肯定都能想到,问题是这题要用一个扩展版的--Kth Min-Ma ...
- 【BZOJ3622】已经没有什么好害怕的了 容斥+DP
[BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...
- HDU 5794 A Simple Chess (容斥+DP+Lucas)
A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...
- [CF1086E]Beautiful Matrix(容斥+DP+树状数组)
给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...
- $bzoj2560$ 串珠子 容斥+$dp$
正解:容斥+$dp$ 解题报告: 传送门$QwQ$ $umm$虽然题目蛮简练的了但还是有点难理解,,,我再抽象一点儿,就说有$n$个点,点$i$和点$j$之间有$a_{i,j}$条无向边可以连,问有多 ...
- 洛谷P4707 重返现世(扩展MinMax容斥+dp)
传送门 我永远讨厌\(dp.jpg\) 前置姿势 扩展\(Min-Max\)容斥 题解 看纳尔博客去→_→ 咱现在还没搞懂为啥初值要设为\(-1\)-- //minamoto #include< ...
- 【做题】51NOD1518 稳定多米诺覆盖——容斥&dp
题意:求有多少种方案,用多米诺骨牌覆盖一个\(n\times m\)的棋盘,满足任意一对相邻行和列都至少有一个骨牌横跨.对\(10^9+7\)取模. \(n,m \leq 16\) 首先,这个问题的约 ...
- BZOJ3622(容斥+dp)
思路 "恰k个"考虑求至少k.k+1--个容斥 题面说所有数字都不同,可以将所求转化为糖比药多的组数恰为\((n+k)/2\)的方案数 \(f[i][j]\)数组我觉得更好的理解方 ...
随机推荐
- centos7中运行ifconfig提示-bash: ifconfig: command not found
centos7中运行ifconfig提示-bash: ifconfig: command not found 查看/sbin/下是否有ifconfig,若没有通过如下命令安装 sudo yum ins ...
- Git命令相关
特别说明 关于命令行中参数前面的-和--的区别 - 通常后面接参数的缩写 -- 通常后面接参数的全拼 eg: git status --short 等价于 git status -s 常用命令 创建版 ...
- 龙贝格积分(c++)
用龙贝格算法计算积分 #include <iostream> #include<cmath> #include <iomanip> using namespace ...
- Java 强,弱,软,虚 引用
import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; public class TestGC { /** * ...
- linux学习(5):linux 性能瓶颈排查
作为开发人员,肯定遇到过以下场景,应用突然卡住了,或者异常退出,cpu占用过高等各种异常情况,一般遇到这些异常情况,该如何去查找具体原因呢? linux和jdk提供了一些命令和工具来查看内存.cpu. ...
- spring AOP的使用步骤
Spring AOP定义及术语:https://www.cnblogs.com/wangcp-2014/p/11544674.html spring AOP的使用,分三个步骤,记住这三个步骤,AOP就 ...
- Char.IsDigit与Char.IsNumber的区别
需要判断Char是否为数字,查看了下MSDN,发现有三种方法: Char.IsDigit (aChar) 指示指定字符串中位于指定位置处的字符是否属于十进制数字类别 Char ...
- CEF 远程调试
转载:https://www.cnblogs.com/TianFang/p/9906786.html 转载:https://stackoverflow.com/questions/29117882/d ...
- odoo开发笔记 -- 模型后台方法返回前端form视图和tree视图的写法
待补充: 参考:工作单跳转到通关清单 --form(一对一) 工作单跳转到报关单列表 --tree (一对多)
- Windows上python2和python3共存
1.找到python2安装目录 2.将应用程序中的python重命名为python2,或自行定义. 3.为python2设置系统变量中的path变量.注意,记得加上英文的分号. 验证:输入python ...