这个东西是一个非常好玩的数学工具。

$$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$个元素的贡献期望。

这个式子一看就很高大上。。。


现在是例题时间

先来一道最最基础的模板


HDU4336 Card Collector

题目描述:

有$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}$$

上面的等差数列*等比数列用错位相减法就可以算出来了。

这是一个结论,是要记住的。

  1. #include<cstdio>
  2. #define Rint register int
  3. using namespace std;
  4. int n;
  5. double p[], ans;
  6. inline void dfs(int dep, int tot, double sum){
  7. if(dep == n){
  8. if(sum > 1e-) ans += (tot & ) ? / sum : - / sum;
  9. return;
  10. }
  11. dfs(dep + , tot + , sum + p[dep]);
  12. dfs(dep + , tot, sum);
  13. }
  14. int main(){
  15. while(~scanf("%d", &n)){
  16. for(Rint i = ;i < n;i ++) scanf("%lf", p + i);
  17. ans = ;
  18. dfs(, , );
  19. printf("%.6lf\n", ans);
  20. }
  21. }

luogu4707 重返现世

题目描述:

在$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}$$

  1. #include<cstdio>
  2. #define Rint register int
  3. using namespace std;
  4. typedef long long LL;
  5. const int N = , M = , K = , mod = ;
  6. int n, k, m, p[N], dp[M][K], inv[M], ans;
  7. int main(){
  8. scanf("%d%d%d", &n, &k, &m); k = n + - k;
  9. inv[] = ;
  10. for(Rint i = ;i <= m;i ++) inv[i] = (LL) (mod - mod / i) * inv[mod % i] % mod;
  11. for(Rint i = ;i <= n;i ++) scanf("%d", p + i);
  12. dp[][] = ;
  13. for(Rint i = ;i <= n;i ++)
  14. for(Rint j = m;j >= p[i];j --)
  15. 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;
  16. for(Rint i = ;i <= m;i ++) ans = (ans + (LL) dp[i][k] * inv[i]) % mod;
  17. printf("%d\n", (LL) ans * m % mod);
  18. }

min-max容斥笔记及例题的更多相关文章

  1. min-max 容斥

    $\min - \max$ 容斥 Part 1 对于简单的$\min - \max$容斥有一般形式,表达为:$\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-1 ...

  2. 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 ...

  3. min-max容斥学习笔记

    min-max容斥学习笔记 前置知识 二项式反演 \[ f(n)=\sum_{i=0}^n\binom{n}{i}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^{ ...

  4. [总结] Min-Max容斥学习笔记

    min-max 容斥 给定集合 \(S\) ,设 \(\max(S)\) 为 \(S\) 中的最大值,\(\min(S)\) 为 \(S\) 中的最小值,则: \[\max(S)=\sum_{T\in ...

  5. [学习笔记]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, ...

  6. 【学习笔记】Min-max 容斥

    经常和概率期望题相结合. 对于全序集合 \(S\),有: \[\max S=\sum\limits_{T\subseteq S,T\not=\varnothing}(-1)^{\vert T\vert ...

  7. MinMax 容斥 学习笔记

    基本形式 \[ \max(S) = \sum_{T\subseteq S, T \neq \varnothing} (-1)^{|T|-1}\min(T) \] 证明 不提供数学证明. 简要讲一下抽象 ...

  8. [模板] 容斥原理: 二项式反演 / 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 ...

  9. $Min\_25$筛学习笔记

    \(Min\_25\)筛学习笔记 这种神仙东西不写点东西一下就忘了QAQ 资料和代码出处 资料2 资料3 打死我也不承认参考了yyb的 \(Min\_25\)筛可以干嘛?下文中未特殊说明\(P\)均指 ...

随机推荐

  1. 【转】Web前端性能优化——如何提高页面加载速度

    前言:  在同样的网络环境下,两个同样能满足你的需求的网站,一个“Duang”的一下就加载出来了,一个纠结了半天才出来,你会选择哪个?研究表明:用户最满意的打开网页时间是2-5秒,如果等待超过10秒, ...

  2. python : 将txt文件中的数据读为numpy数组或列表

    很多时候,我们将数据存在txt或者csv格式的文件里,最后再用python读取出来,存到数组或者列表里,再做相应计算.本文首先介绍写入txt的方法,再根据不同的需求(存为数组还是list),介绍从tx ...

  3. CentOS安装python-pip

    在使用Python时,需要导入一些第三方工具包,一般情况下,鼓励使用pip来安装管理这些第三方的包,这里我们来看一下如何在CentOS 6.4上安装Python-pip.   第一步,下载python ...

  4. 浅析C#中的结构体和类

    类和结构是 .NET Framework 中的常规类型系统的两种基本构造. 两者在本质上都属于数据结构.封装着一组总体作为一个逻辑单位的数据和行为. 数据和行为是该类或结构的"成员" ...

  5. Pytest运行测试用例的多种方式和调试

    测试用例上方使用多个fixtures叠加时,是从下往上进行fixtures调用的.如果是 @pytest.mark.usefixtures('action','a','action2')这种形式,是从 ...

  6. 关于Kafka high watermark的讨论2

    之前写过一篇关于Kafka High watermark的文章,引起的讨论不少:有赞扬之声,但更多的是针对文中的内容被challenge,于是下定决心找个晚上熬夜再看了一遍,昨晚挑灯通读了一遍确实发现 ...

  7. iOS 判断两个日期之间的间隔

    本文转载至 http://www.cnblogs.com/Ewenblog/p/3891791.html   两个时间段,判断之间的相差,做一些时间范围限制使用 NSDateFormatter * d ...

  8. StrokesPlus 谷歌搜索结果转https

    StrokesPlus 谷歌搜索结果转https 亲测ie11可用 --清空剪切板 acSetClipboardText('') acSendKeys("^l") --选中地址栏 ...

  9. IOS Https适配摸索

    转:http://www.jianshu.com/p/f312a84a944c https封面 在WWDC 2016开发者大会上,苹果宣布了一个最后期限:到2017年1月1日 App Store中的所 ...

  10. Web(一)

    Tomcat 服务器       B/S 浏览器/服务器       C/S 客户端/服务器  URI :大 广 /项目名                      URL: 小  http://lo ...