重返现世——题解

\(orz\)出题人,神仙题啊。

题目链接luogu P4707

  • 题意
    给一个\(n\)元集合\(S\),每一次从中选出一个元素,第\(i\)个元素被选出的概率为\(\frac{p_i}{m}\),求选出\(k\)个不同元素的期望次数。
    \(n \leq 1000\), \(n-k\leq 10\), \(m\leq 10000\), \(p_i\leq m\), \(\sum p_i=m\)
    \(timelimit=2.00s\) \(memorylimit=125MB\)

  • 前置知识
    首先一看就知道要用\(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\le 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\),算一下就好。
原文地址:https://www.cnblogs.com/leukocyte/p/13281969.html