【Luogu4707】重返现世(min-max容斥)
【Luogu4707】重返现世(min-max容斥)
题面
洛谷
求全集的\(k-max\)的期望
题解
\(min-max\)容斥的证明不难,只需要把所有元素排序之后考虑组合数的贡献,容斥系数先设出来后也不难解出。
那么我们来考虑如何求解\(k-max\),设出容斥系数\(f(|T|)\)
\]
显然是从小到大考虑每个元素作为\(min\)时候的贡献,并且我们只需要其中第\(k\)大的贡献。
假设\(n=|S|\),那么对于第\(x\)大的数,有:
\]
令\(x=n-x\)
\]
直接套二项式反演:
\]
显然只有\(i=k-1\)的时候才有贡献,也就是:
\]
化简后得到:
\]
好了,带回\(min-max\)容斥的式子,得到:
\]
回到这题,要求的就是\(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容斥)的更多相关文章
- Luogu P4707 重返现世 (拓展Min-Max容斥、DP)
题目链接 https://www.luogu.org/problem/P4707 题解 最近被神仙题八连爆了-- 首先Min-Max容斥肯定都能想到,问题是这题要用一个扩展版的--Kth Min-Ma ...
- P4707 重返现世 扩展 MinMax 容斥+DP
题目传送门 https://www.luogu.org/problem/P4707 题解 很容易想到这是一个 MinMax 容斥的题目. 设每一个物品被收集的时间为 \(t_i\),那么集齐 \(k\ ...
- Luogu4707 重返现世 min-max容斥、DP
传送门 kthMinMax的唯一模板? 首先你需要知道kth Min-Max定理的内容:\(kthmax(S) = \sum\limits_{T \subseteq S} (-1)^{|T| - k} ...
- 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 ...
- 【题解】洛谷P4707重返现世
在跨年的晚上玩手机被妈妈骂了赶来写题……呜呜呜……但是A题了还是很开心啦,起码没有把去年的题目留到明年去做ヾ(◍°∇°◍)ノ゙也祝大家2019快乐! 这题显然的 kth min-max 容斥就不说了, ...
- [模板] 容斥原理: 二项式反演 / 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-Max容斥及其推广和应用
概念 Min-Max容斥,又称最值反演,是一种对于特定集合,在已知最小值或最大值中的一者情况下,求另一者的算法. 例如: $$max(a,b)=a+b-min(a,b) \\\ max(a,b,c)= ...
- min-max容斥笔记及例题
这个东西是一个非常好玩的数学工具. $$max(S)=\sum_{T\subset S}(-1)^{|T|-1}min(T)$$ $$max_k(S)=\sum_{T\subset S}(-1)^{| ...
随机推荐
- pinpoint vs druid
主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid) - ppjj - 博客园 https://www.cnblogs.com/nizuimeiabc1/ ...
- JQuery/JS select标签动态设置选中值、设置禁止选择 button按钮禁止点击 select获取选中值
//**1.设置选中值:(根据索引确定选中值)**// var osel=document.getElementById("selID"); //得到select的ID var o ...
- oracle服务端安装与配置
从oracle官网下载oracle服务端的安装包. 下载下来是两个压缩文件,两个压缩文件都解压(缺一不可)到同一目录下,最后会得到一个database文件夹. 双击database文件夹下的setup ...
- [转帖]Windows批处理(cmd/bat)常用命令小结
Windows批处理(cmd/bat)常用命令小结 非常值得学习的文档 先放这里 有时间做实验, 转载自:“趣IT”微信公共号 前言 批处理文件(batch file)包含一系列 DOS命令,通常用于 ...
- Spring boot 将配置文件属性注入到一个bean中
现在要做的就是将如下配置文件中的内容注入到一个bean 名为Properties中. Redis.properties配置文件中的内容如下: Properties java bean中代码如下,注意注 ...
- python之路--管道, 事件, 信号量, 进程池
一 . 管道 (了解) from multiprocessing import Process, Pipe def f1(conn): # 管道的recv 里面不用写数字 from_main_proc ...
- python之路-字符串
一.类型转换 a = 10 print(type(a)) # <class 'int'> d = str(a) # 把数字转换成str print(type(d)) # <class ...
- JQ remove()方法实现似收货地址逐一删除的效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【转】console.log 用法
标签: 转自http://www.cnblogs.com/ctriphire/p/4116207.html 大家都有用过各种类型的浏览器,每种浏览器都有自己的特色,本人拙见,在我用过的浏览器当中,我是 ...
- spring @Validated 注解开发中使用group分组校验
之前知道spring支持JSR校验,在自己定义的bean中加入@NotNull,@NotBlank,@Length等之类的校验用于处理前台传递过来的request请求,避免在写多余的代码去处理. 但是 ...