【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. Python_数据类型的补充、集合set、深浅copy

    1.数据类型的补充 1.1 元组 当元组里面只有一个元素且没有逗号时,则该数据的数据类型与括号里面的元素相同. tu1 = ('laonanhai') tu2 = ('laonanhai') prin ...

  2. git reset的用法

    git reset三个选项 --mix,--hard,--soft 数据 针对每个选项都是操作这个文件. [root@centos demo]# git init Initialized empty ...

  3. php开发之常用验证方法

    1.邮箱验证 function isEmail($email) { if (!$email) { return false; } return preg_match('/^[_\.0-9a-z-]+@ ...

  4. 【Python3练习题 013】 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字

    a=input('输入数字>>>') count=int(input('几个数字相加>>>')) ret=[] for i in range(1,count+1): ...

  5. h5 文件下载

    一.a 标签 移动端不支持 onDownFile= (url, filename) => { const downUrl = `http://10.1.109.123:19092/down/to ...

  6. Windows BAT 命令下del 与 rd 命令

    https://blog.csdn.net/jigetage/article/details/81180757 RD 与 DEL 命令 windows bat 目录和文件的删除处理. 命令:RD,删除 ...

  7. html5 datalist 选中option选项后的触发事件

    使用input + datalist 实现自动补全功能,其中datalist中的内容是根据input输入的内容动态变换的,代码如下 <!DOCTYPE HTML> <html> ...

  8. python读文件指定行的数据

    import linecacheprint linecache.getline('url.txt',2) 读取url.txt文件的第2行内容

  9. k8s调度器、预选策略及调度方式

    一.k8s调度流程 1.(预选)先排除完全不符合pod运行要求的节点2.(优先)根据一系列算法,算出node的得分,最高没有相同的,就直接选择3.上一步有相同的话,就随机选一个 二.调度方式 1.no ...

  10. Centso7 简单优化(阿里云服务器)

    ##.下载常用包 # yum -y install wget net-tools screen lsof tcpdump nc mtr openssl-devel vim bash-completio ...