题目分析

题目就是求第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 【重返现世】的更多相关文章

  1. 洛谷 P4707 重返现世

    洛谷 P4707 重返现世 k-minimax容斥 有这一个式子:\(E(\max_k(S))=\sum_{T\subseteq S}(-1)^{|T|-k}C_{|T|-1}^{k-1}\min(T ...

  2. [洛谷P4707] 重返现世

    Description 为了打开返回现世的大门,\(Yopilla\) 需要制作开启大门的钥匙.\(Yopilla\) 所在的迷失大陆有 \(n\) 种原料,只需要集齐任意 \(k\) 种,就可以开始 ...

  3. 洛谷P4707 重返现世 [DP,min-max容斥]

    传送门 前置知识 做这题前,您需要认识这个式子: \[ kthmax(S)=\sum_{\varnothing\neq T\subseteq S}{|T|-1\choose k-1} (-1)^{|T ...

  4. 【题解】洛谷P4707重返现世

    在跨年的晚上玩手机被妈妈骂了赶来写题……呜呜呜……但是A题了还是很开心啦,起码没有把去年的题目留到明年去做ヾ(◍°∇°◍)ノ゙也祝大家2019快乐! 这题显然的 kth min-max 容斥就不说了, ...

  5. 洛谷P4707 重返现世(扩展MinMax容斥+dp)

    传送门 我永远讨厌\(dp.jpg\) 前置姿势 扩展\(Min-Max\)容斥 题解 看纳尔博客去→_→ 咱现在还没搞懂为啥初值要设为\(-1\)-- //minamoto #include< ...

  6. 洛谷 P4707 - 重返现世(扩展 Min-Max 容斥+背包)

    题面传送门 首先看到这种求形如 \(E(\max(T))\) 的期望题,可以套路地想到 Min-Max 容斥 \(\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T| ...

  7. Luogu P4707 重返现世

    题目描述 为了打开返回现世的大门,Yopilla 需要制作开启大门的钥匙.Yopilla 所在的迷失大陆有 \(n\) 种原料,只需要集齐任意 \(k\) 种,就可以开始制作. Yopilla 来到了 ...

  8. Luogu P4707 重返现世 (拓展Min-Max容斥、DP)

    题目链接 https://www.luogu.org/problem/P4707 题解 最近被神仙题八连爆了-- 首先Min-Max容斥肯定都能想到,问题是这题要用一个扩展版的--Kth Min-Ma ...

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

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

随机推荐

  1. JavaScript学习总结(五)——jQuery插件开发与发布

    jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...

  2. 无责任Windows Azure SDK .NET开发入门(二):使用Azure AD 进行身份验证

    <編者按>本篇为系列文章,带领读者轻松进入Windows Azure SDK .NET开发平台.本文为第二篇,将教导读者使用Azure AD进行身分验证.也推荐读者阅读无责任Windows ...

  3. Java - HashMap 多线程安全解析

    HashMap多线程并发问题分析 多线程put后可能导致get死循环 从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当时的程序是单线程的,一切都没有问题.后来,我们的程序性能有问 ...

  4. Java - TreeMap源码解析 + 红黑树

    Java提高篇(二七)-----TreeMap TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap ...

  5. pts/0代表什么意思?

    在linux命令行中经常看到pts/0,这是什么意思呢??妈蛋!! 先说pts/0吧,man里面是这样说的:ptmx and pts - pseudo-terminal master and slav ...

  6. [HNOI2011]括号修复

    设\(nd[4]\) 0--多出来的右括号 1--多出来的左括号 2--取反后多出来的右括号 3--取反后多出来的左括号 这样一来 Swap: swap(0,3),swap(1,2),swap(sn[ ...

  7. 安装nvm管理不同的node版本

    在工作或者学习中,偶尔会遇到需要切换不同node版本的需求,幸好有神器nvm可以帮我们解决问题.下面我们就来讲解如何在window系统上安装nvm!

  8. 001Git & GitHub

    01.创建GitHub账号 请点击标题链接,阅读官网帮助 02.创建代码仓库 请点击标题链接,阅读官网帮助 03.安装Git 注:Git官网下载太慢,可在[360卫士]-->[软件管家]中搜索下 ...

  9. iftop 命令

    在Linux中有一个可以实施监控网络流量的一个工具那就是我们这次要说的iftop命令,这个命令不是系统自带的内置命令,在使用之前是需要先进行安装的 安装方式:yum -y install iftop就 ...

  10. 语义SLAM的数据关联和语义定位(二)Semantic Localization Via the Matrix Permanent

    论文假设和单目标模型 这部分想讲一下Semantic Localization Via the Matrix Permanent这篇文章的一些假设. 待求解的问题可以描述为 假设从姿态\(x\)看到的 ...