洛谷 P4707 【重返现世】
题目分析
题目就是求第K种原料的出现期望时间。
考虑广义min-max容斥。
\(\text{kthmax}(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-k}\binom{|T|-1}{k-1}\min(T)\)
显然\(\min(T)=\frac{m}{\sum\limits_{i\in S}p_i}\)。
发现\(m\)的范围很小,那么我们可以考虑设状态dp算贡献。
设\(f_{j,k}\)表示对于集合\(|S|\),\(j=\sum\limits_{i\in S}p_i\),集合大小为\(k\)的方案数。
转移显然。
但是时间复杂度为\(O(n^2m)\),难以ac。
观察到还有\(|n-k|<=10\)的条件,考虑改变状态。
设\(f_{j,k}\)表示对于集合\(S\),\(j=\sum\limits_{i\in S}p_i\),
组合数下标为\(k\)的\(\sum\limits_{T}(-1)^{|T|-k}\binom{|T|-1}{k-1}\min(T)\)的值。
对于一个概率为\(v\)的新物品:
如果不加入,直接累加前面的答案。
如果加入,那么答案应该是从\(f_{j-v,k-1}\)转移过来。
我们观察一波式子(标解)
我们用\(g_{i,j}\)表示对于集合\(S\),\(|S|=i\),\(j= \sum\limits_{k\in S}p_k\)的方案数。
对于\(f_{j-v,k}\):
\(f_{j-v,k-1}=\sum\limits_{i}(-1)^{i-k+1}\binom{i-1}{k-2}g_{i,j-v}\)
\(=-\sum\limits_{i}(-1)^{i-k}\binom{i-1}{k-2}g_{i,j-v}\)
增加一个物品后:
\(\triangle f_{j,k}=\sum\limits_i(-1)^{i-k+1}\binom{i}{k-1}g_{i,j-v}\)
\(=-\sum\limits_i(-1)^{i-k}\binom{i}{k-1}g_{i,j-v}\)
两式相减:
\(\triangle f_{j,k}-f_{j-v,k-1}=-\sum\limits_i(-1)^{i-k}\binom{i-1}{k-1}g_{i,j-v}\)
\(=-f_{j-v,k}\)
因此我们得到了递推式:
\(f_{j,k}=f'_{j,k}+f'_{j-v,k-1}-f'_{j-v,k}\)
因此我们就可以\(O(m*(n-k))\)解决dp。
答案就是\(\sum\limits_{i=1}^{m}\frac{m}{i}f_{i,k}\)
#include <bits/stdc++.h>
using namespace std;
inline int Getint(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch))ch!='-'?:f=-1,ch=getchar();
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
typedef long long ll;
const int mod=998244353;
int n,K,m,f[2][10005][15],p[1005];
int inv[10005];
ll Pow(ll x,ll k){
ll ret=1;
while(k){
if(k&1)ret=ret*x%mod;
k>>=1;x=x*x%mod;
}
return ret;
}
int main(){
n=Getint();K=n-Getint()+1;m=Getint();
for(int i=0;i<=m;i++)inv[i]=Pow(i,mod-2);
for(int i=1;i<=n;i++)p[i]=Getint();
int cur=0,pre=1;
for(int i=1;i<=10;i++)f[cur][0][i]=-1;
for(int i=1;i<=n;i++){
cur^=1;pre^=1;
for(int j=0;j<=m;j++)
for(int k=1;k<=10;k++){
f[cur][j][k]=f[pre][j][k];
if(j>=p[i]){
f[cur][j][k]=(f[cur][j][k]-f[pre][j-p[i]][k])%mod;
if(k>0)f[cur][j][k]=(f[cur][j][k]+f[pre][j-p[i]][k-1])%mod;
}
}
}
ll ans=0;
for(int i=1;i<=m;i++)ans=(ans+1ll*f[cur][i][K]%mod*m%mod*inv[i])%mod;
cout<<(ans+mod)%mod<<"\n";
}
洛谷 P4707 【重返现世】的更多相关文章
- 洛谷 P4707 重返现世
洛谷 P4707 重返现世 k-minimax容斥 有这一个式子:\(E(\max_k(S))=\sum_{T\subseteq S}(-1)^{|T|-k}C_{|T|-1}^{k-1}\min(T ...
- [洛谷P4707] 重返现世
Description 为了打开返回现世的大门,\(Yopilla\) 需要制作开启大门的钥匙.\(Yopilla\) 所在的迷失大陆有 \(n\) 种原料,只需要集齐任意 \(k\) 种,就可以开始 ...
- 洛谷P4707 重返现世 [DP,min-max容斥]
传送门 前置知识 做这题前,您需要认识这个式子: \[ kthmax(S)=\sum_{\varnothing\neq T\subseteq S}{|T|-1\choose k-1} (-1)^{|T ...
- 【题解】洛谷P4707重返现世
在跨年的晚上玩手机被妈妈骂了赶来写题……呜呜呜……但是A题了还是很开心啦,起码没有把去年的题目留到明年去做ヾ(◍°∇°◍)ノ゙也祝大家2019快乐! 这题显然的 kth min-max 容斥就不说了, ...
- 洛谷P4707 重返现世(扩展MinMax容斥+dp)
传送门 我永远讨厌\(dp.jpg\) 前置姿势 扩展\(Min-Max\)容斥 题解 看纳尔博客去→_→ 咱现在还没搞懂为啥初值要设为\(-1\)-- //minamoto #include< ...
- 洛谷 P4707 - 重返现世(扩展 Min-Max 容斥+背包)
题面传送门 首先看到这种求形如 \(E(\max(T))\) 的期望题,可以套路地想到 Min-Max 容斥 \(\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T| ...
- Luogu P4707 重返现世
题目描述 为了打开返回现世的大门,Yopilla 需要制作开启大门的钥匙.Yopilla 所在的迷失大陆有 \(n\) 种原料,只需要集齐任意 \(k\) 种,就可以开始制作. Yopilla 来到了 ...
- 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\ ...
随机推荐
- 写个OAuth2.0的请求端来测试自己的OAuth2.0服务端(二)
在上一篇文章中,我们介绍了怎么创建自己的服务器,现在我们开始写个client端,来测试. 我们创建一个MVC项目,叫TestOAuthClient 1. 代码开始 1)第一步,我们创建一个MainCo ...
- Docker 为 ASP.NET Core Web 应用程序生成 Docker 映像,创建并运行多个容器
1.为 ASP.NET Core 应用程序生成 Docker 映像 下载这个事例项目:https://github.com/dotnet/dotnet-docker/tree/master/sampl ...
- vb.net連接Oracle数据库
Imports Oracle.DataAccess.Client '導入命名空間 Public Class Form1 Dim Sql As String Public SqlTP As Oracle ...
- [日常] Go语言圣经--JSON习题2
练习 4.12: 流行的web漫画服务xkcd也提供了JSON接口.例如,一个 https://xkcd.com/571/info.0.json 请求将返回一个很多人喜爱的571编号的详细描述. 下载 ...
- iOS: Designated Initializer(指定初始化函数)
偶然间看到“ Designated Initializer”一词,心里一惊,这是什么东西,怎么没听说过?难道是我道行太浅?真的是这样?(好伤心啊)一阵子我怀疑之后,果断上网查了一下这个 Designa ...
- web开发中的两把锁之数据库锁:(高并发--乐观锁、悲观锁)
这篇文章讲了 1.同步异步概念(消去很多疑惑),同步就是一件事一件事的做:sychronized就是保证线程一个一个的执行. 2.我们需要明白,锁机制有两个层面,一种是代码层次上的,如Java中的同步 ...
- 数据结构与算法--最小生成树之Kruskal算法
数据结构与算法--最小生成树之Kruskal算法 上一节介绍了Prim算法,接着来看Kruskal算法. 我们知道Prim算法是从某个顶点开始,从现有树周围的所有邻边中选出权值最小的那条加入到MST中 ...
- Go 语言相关的优秀框架,库及软件列表
If you see a package or project here that is no longer maintained or is not a good fit, please submi ...
- 线程基础的一些理解(一)(java)
一.多线程的基本概念 线程是指进程中的一个执行场景,也就是执行流程,所以我们首先要聊一聊进程,以及进程和线程的关系 1.什么是进程? 一个进程对应一个应用程序,就像我们在windows系统中启动Wo ...
- django 参考
1. 路由系统 https://www.cnblogs.com/maple-shaw/articles/9282718.html 2. 视图 https://www.cnblogs.com/maple ...