先\(orz\)出题人,神仙题啊。
题目链接luogu P4707
-
题意
给一个\(n\)元集合\(S\),每一次从中选出一个元素,每一个元素被选出的概率为\(\frac{p_i}{m}\),求选出\(k\)个不同元素的期望次数。
\(n<=1000\),\(|n-k|<=10\),\(m<=10000\),\(p_i<=m\),\(\sum p_i=m\)
-
前置知识
首先一看就知道要用\(min-max\)容斥,下面只给出式子,具体证明略。
普通形式:
\[max(S)=\sum_{T \subseteq S} (-1)^{|T|-1} min(T)
\]
扩展(第\(k\)大):
\[kthmax(S)=\sum_{T\subseteq S} (-1)^{|T|-k} \binom{|T|-1}{k-1}min(T)
\]
\(min\)的求法同理。
这东西可以扩展到期望。
- 题解
现在我们回到原题。
将\(k \to n-k+1\)
这样就可以直接套\(kthmax\)的式子,即
\[E(kthmax(S))=\sum_{T\subseteq S} (-1)^{|T|-k} \binom{|T|-k}{k-1}E(min(T))
\]
这样我们就得到了一个十分暴力的做法,直接枚举\(S\)的\(2^n\)个子集,统计答案。
很显然这样通过不了全部数据,考虑对这个进行优化。
观察一下数据范围,有\(m<=10000\),限制了值域,所以我们考虑\(DP\)。
设\(f_{i,j,k}\)表示前\(i\)个元素,选出来的子集元素概率和为\(j\),是\(kth\)意义下的\(\sum_{T\subseteq S} (-1)^{|T|-k} \binom{|T|-1}{k-1}\)
我们令\(S_i\)表示前\(i\)个元素组成的集合,那么上面的式子写成数学形式就是这样:
\[f_{i,j,k}=\sum_{T\subseteq S_i} [(\sum_{t\in T} pt)=j] (-1)^{|T|-k} \binom{|T|-1}{k-1}
\]
所以有
\[f_{i,j,k}=\sum_{T\subseteq S_{i-1}} [(\sum_{t\in T} pt)=j] (-1)^{|T|-k} \binom{|T|-1}{k-1}+\sum_{T\subseteq S_{i-1}} [(\sum_{t\in T} pt)=j-pi] (-1)^{|T|+1-k} \binom{|T|+1-1}{k-1}
\]
根据这个式子,我们对\(f\)的定义,以及组合数中的\(\binom{i}{j}=\binom{i-1}{j}+\binom{i-1}{j-1}\),可以得到
\[f_{i,j,k}=f_{i-1,j,k}+(-1)\sum_{T\subseteq S_{i-1}} [(\sum_{t\in T} pt)=j-pi] (-1)^{|T|-k} \binom{|T|-1}{k-1}+\sum_{T\subseteq S_{i-1}} [(\sum_{t\in T} pt)=j-pi] (-1)^{|T|-(k-1)} \binom{|T|-1}{k-2}
\]
所以
\[f_{i,j,k}=f_{i-1,j,k}-f_{i-1,j-p_i,k}+f_{i-1,j-p_i,k-1}
\]
这样主干就出来了。
- 一些细节
首先是边界,可以把\(i=1\)带进去手算,然后就有\(f_{0,0,0}=0, f_{0,0,k}=-1\)
接着因为空间的限制,将\(i\)那一维滚动掉,这样就可以实现了。
最后统计答案直接枚举\(j\),算一下就好。
重返现世——题解
标签:子集 范围 返现 通过 tps 数据 实现 display https
原文地址:https://www.cnblogs.com/leukocyte/p/13281969.html