题目大意:

给定\(n\)个物品和每个物品出现的概率,收集到至少\(k\)个物品的期望时间。
\(k \leq 10\)

思路:

好题!

容斥计算第k大的期望,考虑计算第i大的数的贡献:
\[ \begin{aligned} &\sum_{j=0}^{i-1}{i-1\choose j}f_{j}=[i=k]\\ &\sum_{j=0}^{i}{i\choose j}f_{j}=[i=k-1]\\ &f_i=\sum_{j=0}^{i}(-1)^{i-j}{i\choose j}[j=k-1]\\ &f_i=(-1)^{i-k+1}{i\choose k-1}\\ \end{aligned} \]
可得kth-max 的公式为:
\[ kth(S)=\sum_{T\subseteq S}(-1)^{|T|-k}{|T|-1\choose k-1}\min(T) \]
其中\(\min(T)=\frac{m}{\sum_{i\in T}p_i}\)。

我们需要求出所有\(|T|\geq k\)的\(T\),无法直接全部求出,观察到\(m=\sum{p_i} \leq 10^{4}\),于是考虑DP。

设\(f_{i,j}\)为选了\(i\)个数,其中\(\sum{p_i}=j\)的方案数,时间复杂度\(\Theta(n^2m)\)。

时间复杂度难以通过,考虑进一步优化:

设\(dp_{j,k}\) 表示\(\sum{p_i}=j\),且当前求的是第\(k\)大的方案数系数之积的和,考虑依次将\(n\)个物品加入,对于\(dp_{j,k}\),有加入第\(i\)个物品和不加入第\(i\)个物品两种选择,转移时主要考虑强制加入第\(i\)种物品的选择。

对于强制选择第i个点的部分,集合的大小需要加\(1\),考虑从前\(i-1\)个物品的状态转移过来,不难发现我们需要的式子是:
\[ \sum_{i}(-1)^{i+1-k}{i \choose k-1}f_{i,j-p} \]
其中 i 枚举的是之前选择的集合大小。

但是上一个状态\(dp_{j-p,k-1}\)可以给我们提供的式子是:
\[ \sum_{i}(-1)^{i-k+1}{i-1 \choose k-2}f_{i,j-p} \]
不难发现之中我们所缺失的部分为:
\[ \begin{aligned} &\sum_{i}(-1)^{i-k+1}{i-1\choose k-1}f_{i,j-p}\\ =&-\sum_{i}(-1)^{i-k}{i-1\choose k-1}f_{i,j-p}\\ =&-dp_{j-p,k} \end{aligned} \]
于是到了最后我们得到了转移方程:
\[ dp_{j,k}=dp'_{j,k}+dp'_{j-p,k-1}-dp'_{j-p,k}\\ \]

/*=======================================* Author : ylsoi* Time : 2019.1.16* Problem : luogu4707* E-mail : ylsoi@foxmail.com* ====================================*/
#include<bits/stdc++.h>#define REP(i,a,b) for(int i=a,i##_end_=b;i<=i##_end_;++i)
#define DREP(i,a,b) for(int i=a,i##_end_=b;i>=i##_end_;--i)
#define debug(x) cout<<#x<<"="<<x<<" "
#define fi first
#define se second
#define mk make_pair
#define pb push_back
typedef long long ll;using namespace std;void File(){freopen("luogu4707.in","r",stdin);freopen("luogu4707.out","w",stdout);
}template<typename T>void read(T &_){_=0; T f=1; char c=getchar();for(;!isdigit(c);c=getchar())if(c=='-')f=-1;for(;isdigit(c);c=getchar())_=(_<<1)+(_<<3)+(c^'0');_*=f;
}const int maxn=1000+10;
const int maxm=10000+10;
const int mod=998244353;
int n,k,m,p[maxn];
ll fac[maxn],ifac[maxn];
ll dp[maxm][maxn],ans;ll qpow(ll x,ll y){ll ret=1; x%=mod;while(y){if(y&1)ret=ret*x%mod;x=x*x%mod;y>>=1;}return ret;
}void math_init(){fac[0]=1;REP(i,1,1e3)fac[i]=fac[i-1]*i%mod;ifac[1000]=qpow(fac[1000],mod-2);DREP(i,1e3-1,0)ifac[i]=ifac[i+1]*(i+1)%mod;
}ll C(int x,int y){if(x<0 || y<0 || x<y)return 0;return fac[x]*ifac[y]%mod*ifac[x-y]%mod;
}void init(){read(n),read(k),read(m);REP(i,1,n)read(p[i]);
}void ad(ll &_,ll __){_=(_+__)%mod;}void work(){k=n-k+1;dp[0][0]=1;REP(i,1,n){DREP(j,m,p[i]){DREP(l,k,1){ad(dp[j][l],dp[j-p[i]][l-1]-dp[j-p[i]][l]);}}}REP(i,1,m)ad(ans,m*qpow(i,mod-2)%mod*dp[i][k]%mod);printf("%lld\n",(ans+mod)%mod);
}int main(){//File();math_init();init();work();return 0;
}

转载于:https://www.cnblogs.com/ylsoi/p/10287658.html

[luogu4707]重返现世——min-max容斥拓展+动态规划相关推荐

  1. P3175 [HAOI2015]按位或(Min - Max容斥,FMT,概率期望,全网最清晰的题解!)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P3175 Prob ...

  2. 【洛谷P4707】重返现世(Min-Max容斥)(背包)

    传送门 题解: 首先令k=n−k+1k=n-k+1k=n−k+1,转化为求第kkk大. 直接利用Kth−MinMaxKth-MinMaxKth−MinMax容斥的式子我们知道要求这个东西: E(kth ...

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

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

  4. 【LOJ#575】【LNR#2】不等关系(容斥,动态规划,分治FFT)

    [LOJ#575][LNR#2]不等关系(容斥,动态规划,分治FFT) 题面 LOJ 题解 一个暴力\(dp\),设\(f[i][j]\)表示考虑完了前\(i\)个位置,其中最后一个数在前面所有数中排 ...

  5. min-max 容斥

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

  6. P4707-重返现世【dp,数学期望,扩展min-max容斥】

    正题 题目链接:https://www.luogu.com.cn/problem/P4707 题目大意 nnn个物品,每次生成一种物品,第iii个被生成的概率是pim\frac{p_i}{m}mpi​ ...

  7. P5643-[PKUWC2018]随机游走【min-max容斥,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P5643 题目大意 给出nnn个点的一棵树,一个人从点xxx开始随机游走,然后QQQ次询问给出一个点集SSS,求期望 ...

  8. 51nod1355-斐波那契的最小公倍数【min-max容斥】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1355 题目大意 定义fif_ifi​表示斐波那契的第iii项,给出一个大 ...

  9. hdu4336-Card Collector【min-max容斥,期望概率】

    正题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题目大意 每次获得第iii张牌的概率为pip_ipi​(每次只能获得一张),期望多少回合后 ...

最新文章

  1. python 数据处理 书_Python数据处理
  2. Golang gRPC 示例
  3. 什么推动当今品牌的忠诚度
  4. 关于php的字符串编码
  5. Web实验一 国内旅游界面
  6. 新装oracle密码文件,oracle密码文件的重建
  7. Windows查看端口占用
  8. Java中的可变参数使用
  9. 在线抽签html,抽签网页板代码
  10. 五色电阻在线计算机,色环电阻(5色环在线电阻计算器)
  11. islower,isalnum,isalpha,tolower,isdigit等c++对ascii字符的处理判断
  12. 在微信公众号中使用JQueryWeui组件实现文件上传
  13. 第2周 Storm概念详解和工作原理,topology、spout、bolt的细节和API讲解之2
  14. 【源码】Spring AOP 9 Advised
  15. 成为人生的赢家都有哪些书_那么,我们是否有代码挑战#1的赢家?
  16. 2021年最全圣诞节攻略,外贸人看这一篇就够了
  17. python中取对数怎么表示_python中取对数
  18. 【计算机网络】Web应用的安全问题——概述
  19. 前方高能!githubjava开源项目
  20. CleanMyMac2023一键清除垃圾缓存和恶意广告插件 时刻保持Mac畅快运行

热门文章

  1. 电视服务器无响应1500,你家的电视盒子直播总是卡,解决方法全都在这里
  2. Policy Gradient 之 A3C 与 A2C 算法
  3. Python 远程连接服务器,用它就够了
  4. 【面经】汇顶科技-音频算法工程师
  5. android apk 分析,Android APK分析工具
  6. maven项目中报错 could not find class that it depends on找不到依赖的问题
  7. X61T装上Windows8 CP了
  8. 新型激光辨识算法助力机器人逃离死胡同
  9. Java NIO与Java BIO的区别是什么?
  10. UBTC项目9月份最新进展