min-max容斥笔记及例题
这个东西是一个非常好玩的数学工具。
$$max(S)=\sum_{T\subset S}(-1)^{|T|-1}min(T)$$
$$max_k(S)=\sum_{T\subset S}(-1)^{|T|-k}C_{|T|-1}^{k-1}min(T)$$
其中$max(S),min(S),max_k(S)$分别表示集合$S$中的最大值,最小值,第$k$大值
现在我们考虑如何证明,显然我们只用证明第二个式子。
设$$max_k(S)=\sum_{T\subset S}f(|T|)\min(T)$$
其中$f(|T|)$是待定的关于$|T|$的函数。
现在我们考虑第$x+1$大的数会被统计到的次数。
$$[x==k-1]=\sum_{i=0}^xC_x^i*f(i+1)$$
用二项式反演就可以得到
$$f(x+1)=\sum_{i=0}^x(-1)^{x-i}*C_x^i*[i==k-1]$$
$$=(-1)^{x-k+1}*C_x^{k-1}$$
所以$f(x)=(-1)^{x-k}*C_{x-1}^{k-1}$
代入原来的式子就可以证明。
而且比这个原理更有用的是它对于期望也成立。
$$E[max(S)]=\sum_{T\subset S}(-1)^{|T|-1}E[min(T)]$$
$$E[max_k(S)]=\sum_{T\subset S}(-1)^{|T|-k}C_{|T|-1}^{k-1}E[min(T)]$$
其中$E[max(S)]$表示出现(?)$S$中所有元素的贡献期望
$E[min(S)]$表示出现$S$中任意一个元素的贡献期望
根据上面两个定义,不难想到$E[max_k(S)]$表示出现至少$|S|-k+1$个元素的贡献期望。
这个式子一看就很高大上。。。
现在是例题时间
先来一道最最基础的模板
题目描述:
有$n$种卡片,每一秒都有$p_i$的概率获得一张第$i$种卡片,求每张卡片都至少有一张的期望时间。
$1\leq n\leq 20,p_i\geq 0,\sum_{i=1}^np_i\leq 1$
只用把式子带进去就可以了。
不过还有一个问题,如何计算$E[min(T)]$?
开始推式子,设$P=P(x\in T)=\sum_{x\in T}p_x$
$$E[min(T)]=\sum_{k=1}^{+\infty}P(min(T)==k)*k$$
$$=P*\sum_{k=0}^{+\infty}(1-P)^k*(k+1)$$
$$=P*\frac{1}{P^2}=\frac{1}{P}$$
上面的等差数列*等比数列用错位相减法就可以算出来了。
这是一个结论,是要记住的。
#include<cstdio>
#define Rint register int
using namespace std;
int n;
double p[], ans;
inline void dfs(int dep, int tot, double sum){
if(dep == n){
if(sum > 1e-) ans += (tot & ) ? / sum : - / sum;
return;
}
dfs(dep + , tot + , sum + p[dep]);
dfs(dep + , tot, sum);
}
int main(){
while(~scanf("%d", &n)){
for(Rint i = ;i < n;i ++) scanf("%lf", p + i);
ans = ;
dfs(, , );
printf("%.6lf\n", ans);
}
}
题目描述:
在$n$个元素中,要集齐$k$种,每过一个单位时间,就会随机生成一个元素,生成第$i$个元素的概率为$\frac{p_i}{m}$,求集齐的期望时间,对$998244353$取模
$1\leq k\leq n\leq 10^3,n-k\leq 10,0\leq p_i\leq m,1\leq \sum_{i=1}^np_i=m\leq 10^4$
首先,题目里面说的是$E[min_k(S)]$,令$k=n+1-k$就可以变为$E[max_k(S)]$
但是直接求是肯定不行的,注意到这个式子与子集有关,就可以联想到dp
设$f_{i,j,k}$表示将前$i$个数作为$S$,$\sum_{x\in T}p_x=j$,$\sum_{T\subset S}(-1)^{|T|-k}C_{|T|-1}^{k-1}$的值。
按照套路,现在应该讨论$i\in T$和$i\notin T$
对于第二种,$f_{i,j,k}+=f_{i-1,j,k}$
对于第一种,$$f_{i,j,k}+=\sum_{i\in T\subset S}(-1)^{|T|-k}C_{|T|-1}^{k-1}$$
$$=\sum_{i\notin T}(-1)^{|T|-k+1}C_{|T|}^{k-1}$$
$$=\sum_{i\notin T}(-1)^{|T|-k+1}C_{|T|-1}^{k-1}+\sum_{i\notin T}(-1)^{|T|-k+1}C_{|T|-1}^{k-2}$$
$$=\sum_{i\notin T}(-1)^{|T|-k}*(-1)*C_{|T|-1}^{k-1}+\sum_{i\notin T}(-1)^{|T|-(k-1)}C_{|T|-1}^{(k-1)-1}$$
$$=f_{i-1,j-p_i,k-1}-f_{i-1,j-p_i,k}$$
所以$f_{i,j,k}=f_{i-1,j,k}+f_{i-1,j-p_i,k-1}-f_{i-1,j-p_i,k}$
还要用滚动数组将第一维滚掉。。。
至于边界,肯定不能设0,因为只有自己加减。。。
算一算就知道$f_{i,0,0}=1$
答案$$ans=m*\sum_{j=1}^m\frac{f_{n,j,k}}{j}$$
#include<cstdio>
#define Rint register int
using namespace std;
typedef long long LL;
const int N = , M = , K = , mod = ;
int n, k, m, p[N], dp[M][K], inv[M], ans;
int main(){
scanf("%d%d%d", &n, &k, &m); k = n + - k;
inv[] = ;
for(Rint i = ;i <= m;i ++) inv[i] = (LL) (mod - mod / i) * inv[mod % i] % mod;
for(Rint i = ;i <= n;i ++) scanf("%d", p + i);
dp[][] = ;
for(Rint i = ;i <= n;i ++)
for(Rint j = m;j >= p[i];j --)
for(Rint s = k;s;s --) dp[j][s] = ((LL) dp[j][s] + dp[j - p[i]][s - ] - dp[j - p[i]][s] + mod) % mod;
for(Rint i = ;i <= m;i ++) ans = (ans + (LL) dp[i][k] * inv[i]) % mod;
printf("%d\n", (LL) ans * m % mod);
}
min-max容斥笔记及例题的更多相关文章
- min-max 容斥
$\min - \max$ 容斥 Part 1 对于简单的$\min - \max$容斥有一般形式,表达为:$\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-1 ...
- Min-max 容斥与 kth 容斥
期望的线性性: \[E(x+y)=E(x)+E(y) \] 证明: \[E(x+y)=\sum_i \sum_j(i+j)*P(i=x,j=y) \] \[=\sum_i\sum_ji*P(i=x,j ...
- min-max容斥学习笔记
min-max容斥学习笔记 前置知识 二项式反演 \[ f(n)=\sum_{i=0}^n\binom{n}{i}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^{ ...
- [总结] Min-Max容斥学习笔记
min-max 容斥 给定集合 \(S\) ,设 \(\max(S)\) 为 \(S\) 中的最大值,\(\min(S)\) 为 \(S\) 中的最小值,则: \[\max(S)=\sum_{T\in ...
- [学习笔记]min-max容斥
[Learning]min-max容斥以及推广 min-max容斥 就是max(a,b)=min(a)+min(b)-min(a,b) max(a,b,c)=a+b+c-min(a,b)-min(a, ...
- 【学习笔记】Min-max 容斥
经常和概率期望题相结合. 对于全序集合 \(S\),有: \[\max S=\sum\limits_{T\subseteq S,T\not=\varnothing}(-1)^{\vert T\vert ...
- MinMax 容斥 学习笔记
基本形式 \[ \max(S) = \sum_{T\subseteq S, T \neq \varnothing} (-1)^{|T|-1}\min(T) \] 证明 不提供数学证明. 简要讲一下抽象 ...
- [模板] 容斥原理: 二项式反演 / Stirling 反演 / min-max 容斥 / 子集反演 / 莫比乌斯反演
//待更qwq 反演原理 二项式反演 若 \[g_i=\sum_{j=1}^i {\binom ij} f_j\] , 则有 \[ f_i=\sum_{j=1}^i (-1)^{i-j} {i \ch ...
- $Min\_25$筛学习笔记
\(Min\_25\)筛学习笔记 这种神仙东西不写点东西一下就忘了QAQ 资料和代码出处 资料2 资料3 打死我也不承认参考了yyb的 \(Min\_25\)筛可以干嘛?下文中未特殊说明\(P\)均指 ...
随机推荐
- Android 测试入门之---Monkey test
这周重点学习的也是Android monkey test 的一些相关知识,也对其进行了初步的操作和试验.讲学习资料整理如下 : Monkey是一个命令行工具 ,可以运行在模拟器里或实际设备中.它向系统 ...
- mininet下建立拓扑时关于远程控制器的一个小问题
最近重装了系统和mininet后,使用mininet时遇到了一点小问题,一开始忽视了细节,使得自己被这个问题困扰了好一会儿,好在后来还是发现了问题所在,故记录下来. $ sudo mn --topo ...
- 【转】WPF自定义控件与样式(7)-列表控件DataGrid与ListView自定义样式
一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等. 本文主要内容: DataGrid自定义样式: ListView自定义样式: 二.Dat ...
- jenkins 启动slave时,找不到合适的java程序
今天添加slave 又不成功,我用右键,发现随意点了java的那个打开,结果刚弹出来就关闭了窗口,显示未启动成功. 真是小白的想法,不过跟工具打交道久了,多少逻辑上想一下不对. 一定是用了不合适的程序 ...
- 【QT】QT下载与安装
很简单 1.下载地址 http://download.qt.io/archive/qt/ 学个单词,archive. 选择一个版本下载,5.9.3. 2.安装 选择组件 MinGW就行了,MinGW- ...
- spray 处理 response 的通用函数
def handleActorResponse: PartialFunction[Try[Any], (StatusCode, ResponseResult)] = { case Failure(ex ...
- SpringBoot切换Tomcat容器,SpringBoot使用Jetty容器
SpringBoot切换Tomcat容器, SpringBoot修改为Jetty容器, SpringBoot使用undertow容器, SpringBoot使用Jetty容器 ============ ...
- EventFlow.helper.js 事件流程控制
/*! * 事件流程管理 * version: 1.0.0-2018.07.25 * Requires ES6 * Copyright (c) 2018 Tiac * http://www.cnblo ...
- Maven传递依赖的坑:父pom中dependencyManagement版本优先级高于传递依赖版本
一.由来 之前同事问了个问题,就是当前工程为spring boot项目,假设版本号为2.0.3 这个项目中依赖了一个spring boot项目依赖(先别管为啥有这么奇葩的依赖,这个版本是1.5.9). ...
- 关于思科C2950交换机清除密码,恢复初始配置的方法
上个月河南做项目,因需要大批量的对服务器进行操作系统的安装,于是想到了PXE网络批量安装, 好不容易到机房的仓库找到网线及一台思科交换机,但到安装的时候,发现思科交换机里应该有配置了 通过配置线连接交 ...