【Luogu4707】重返现世(min-max容斥)

题面

洛谷

求全集的\(k-max\)的期望

题解

\(min-max\)容斥的证明不难,只需要把所有元素排序之后考虑组合数的贡献,容斥系数先设出来后也不难解出。

那么我们来考虑如何求解\(k-max\),设出容斥系数\(f(|T|)\)

\[kmax(S)=\sum_{T\subset S}f(|T|)min(T)
\]

显然是从小到大考虑每个元素作为\(min\)时候的贡献,并且我们只需要其中第\(k\)大的贡献。

假设\(n=|S|\),那么对于第\(x\)大的数,有:

\[[n-x+1=k]=\sum_{i=0}^{n-x}{n-x\choose i}f(i+1)
\]

令\(x=n-x\)

\[[x=k-1]=\sum_{i=0}^{x}{x\choose i}f(i+1)
\]

直接套二项式反演:

\[f(x+1)=\sum_{i=0}^x(-1)^{x-i}{x\choose i}[i=k-1]
\]

显然只有\(i=k-1\)的时候才有贡献,也就是:

\[f(x+1)=(-1)^{x-k+1}{x\choose k-1}
\]

化简后得到:

\[f(x)=(-1)^{x-k}{x-1\choose k-1}
\]

好了,带回\(min-max\)容斥的式子,得到:

\[kmax(S)=\sum_{T\subset S}(-1)^{|T|-k}{|T|-1\choose k-1}min(T)
\]


回到这题,要求的就是\(kmax(All)\),发现题目中给出了限制\(|n-k|\le 10\),但是这样子符合条件的\(T\)依旧很多,那么我们按照\(min(T)\)来分类,而\(min(T)\)之和所有\(T\)中元素出现的概率的和相关,所以直接大力\(dp\)即可。

注意一下,题目里面的\(k\)对应到\(kmax\)的时候,应该是\(n-k+1\),也就是第\(n-k+1\)大的出现时间。

然后讲讲怎么\(dp\),设\(f[i][j]\)表示当前选定的集合的\(p\)的和为\(i\),组合数那里\(k=j\)。

对于当前物品而言,只有两种选择:要么加入集合,要么不加入。

如果不加入的话显然对于答案没有影响直接\(f'[i][j]\rightarrow f[i][j]\)。

否则的话加入这个元素之后会产生影响,考虑具体的转移究竟是什么。

首先\(\displaystyle f[j-p][k-1]=\sum(-1)^{i-(k-1)}{i-1\choose k-2}Cnt[i][j-p]\)。其中\(Cnt[i][j]\)表示集合大小为\(i\),其概率的和为\(j\)的方案数。

等号右边显然就是\(min-max\)容斥的式子,因为要求的只是方案数,所以后面并不是\(min\),而是方案数。

现在要做的就是强制把一个物品塞进去。

塞进去的影响是什么呢?集合大小强制多了\(1\),并且概率的和增加了,并且我们假装\(k\)也改变了。

所以塞进去后的式子是:\(\displaystyle \sum(-1)^{i-(k-1)}{i\choose k-1}Cnt[i][j-p]\)

因为组合数有简单的转移式:\(\displaystyle {n\choose m}={n-1\choose m}+{n-1\choose m-1}\)。

所以多出来的部分不难发现是\(\displaystyle -\sum(-1)^{i-k}{i-1\choose k-1}Cnt[i][j-p]\)

也就是\(-f[j-p][k]\)。

所以转移也就是:\(f[i][j]=f'[i][j]+f'[i-p][j-1]-f'[i-p][j]\)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAX 10100
#define MOD 998244353
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,k,m,p[1010],t,ans,N,nw,pw;
int f[2][10100][15],inv[MAX];
int main()
{
n=read();k=n-read()+1;m=read();
for(int i=1;i<=n;++i)p[i]=read();
if(!k){puts("0");return 0;}
for(int i=1;i<=k;++i)f[0][0][i]=MOD-1;
nw=1;pw=0;
for(int i=1,sum=0;i<=n;nw^=1,pw^=1,sum+=p[i++])
for(int j=0;j<=sum;++j)
for(int l=1;l<=k;++l)
if(f[pw][j][l])
{
add(f[nw][j][l],f[pw][j][l]);
add(f[nw][j+p[i]][l+1],f[pw][j][l]);
add(f[nw][j+p[i]][l],MOD-f[pw][j][l]);
f[pw][j][l]=0;
}
inv[0]=inv[1]=1;for(int i=2;i<=m;++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=1;i<=m;++i)add(ans,1ll*f[pw][i][k]*inv[i]%MOD);
ans=1ll*ans*m%MOD;printf("%d\n",ans);
return 0;
}

【Luogu4707】重返现世(min-max容斥)的更多相关文章

  1. Luogu P4707 重返现世 (拓展Min-Max容斥、DP)

    题目链接 https://www.luogu.org/problem/P4707 题解 最近被神仙题八连爆了-- 首先Min-Max容斥肯定都能想到,问题是这题要用一个扩展版的--Kth Min-Ma ...

  2. P4707 重返现世 扩展 MinMax 容斥+DP

    题目传送门 https://www.luogu.org/problem/P4707 题解 很容易想到这是一个 MinMax 容斥的题目. 设每一个物品被收集的时间为 \(t_i\),那么集齐 \(k\ ...

  3. Luogu4707 重返现世 min-max容斥、DP

    传送门 kthMinMax的唯一模板? 首先你需要知道kth Min-Max定理的内容:\(kthmax(S) = \sum\limits_{T \subseteq S} (-1)^{|T| - k} ...

  4. min-max 容斥

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

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

  6. 【题解】洛谷P4707重返现世

    在跨年的晚上玩手机被妈妈骂了赶来写题……呜呜呜……但是A题了还是很开心啦,起码没有把去年的题目留到明年去做ヾ(◍°∇°◍)ノ゙也祝大家2019快乐! 这题显然的 kth min-max 容斥就不说了, ...

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

  8. Min-Max容斥及其推广和应用

    概念 Min-Max容斥,又称最值反演,是一种对于特定集合,在已知最小值或最大值中的一者情况下,求另一者的算法. 例如: $$max(a,b)=a+b-min(a,b) \\\ max(a,b,c)= ...

  9. min-max容斥笔记及例题

    这个东西是一个非常好玩的数学工具. $$max(S)=\sum_{T\subset S}(-1)^{|T|-1}min(T)$$ $$max_k(S)=\sum_{T\subset S}(-1)^{| ...

随机推荐

  1. rest-framework总结

    1. CBV: pass 2 .APIView class BookView(APIView):pass url(r'^books/$', views.BookView.as_view(),name= ...

  2. Java面试题详解一:面向对象三大特性

    一,多态:1.面向对象四大基本特性:抽象,封装,继承,多态抽象,封装,继承是多态的基础.多态是抽象,封装,继承的表现.2.什么是多态不同类的对象对同一消息作出不同的响应叫做多态3.多态的作用简单来说: ...

  3. MapReduce过程<原创>

    一.预处理阶段 二.Map阶段 一个Map任务被JobTracker(管家)分配到多个TaskTracker(弟弟)执行,如下图所示,弟弟的map()只负责拆分,虽然map()输出两个相同的键值对,但 ...

  4. Thread(生产者和消费者) wait、notify、notifyAll

    在java中,线程间的通信可以使用wait.notify.notifyAll来进行控制.从名字就可以看出来这3个方法都是跟多线程相关的,但是可能让你感到吃惊的是:这3个方法并不是Thread类或者是R ...

  5. 【Java基础】求出1-100之间偶数和

    结果:

  6. Oracle字符函数length substr concat实例

    --字符函数 --伪表dual --(1)求字符串长度 select length('123.456/-*') from dual --(2)截取函数求字符串的子串 ,) from dual --(3 ...

  7. C#如何调用C++的dll

     背景 一个项目,算法部分使用C++的openCV库编写图像处理程序,编译成dll,用户界面采用C#编写,去调用该dll暴露的接口. C#编写的是托管代码,编译生成微软中间语言,而普通C++代码则编译 ...

  8. mac 中登陆mysql忘记密码解决办法

    1.打开终端,输入命令:cd /usr/local/mysql/bin 2.mysql -uroot -p,用这条命令登陆时报错信息: 报错:Enter password: ERROR 1045 (2 ...

  9. python爬虫之git的使用(coding.net的使用)

    1.注册coding.net账号,然后登陆. 2.创建项目 套路和github都一样. 1.1.我们在远程仓库上创建了一个仓库,这样的话,我们需要在本地随便建立一个文件普通文件夹,进去以后,执行git ...

  10. Java Json 数据下划线与驼峰格式进行相互转换

    概述 今天遇见一个需求,需要对json数据进行下划线与驼峰格式之间进行转换,在Fastjson.Jackson.Gson都提供了转换的方式,在这里进行一下列举. User类: public class ...