题目链接

https://www.luogu.org/problem/P4707

题解

最近被神仙题八连爆了……

首先Min-Max容斥肯定都能想到,问题是这题要用一个扩展版的——Kth Min-Max容斥

这个东西需要对Min-Max容斥的本质有着比较深刻的理解。

首先我们从另一个角度证明Min-Max容斥的正确性: \(\max(S)=\sum_{T\in S}f(|T|)\min(T)\), 对于第\((x+1)\)大来说它被计算的次数是\(\sum_{k\ge 0} {x\choose k}f(k+1)\),则有\([x=0]=\sum_{k\ge 0} {x\choose k}f(k+1)\), 二项式反演之后令\(f(k)=(-1)^{k-1}\)即可达到目的。

那么考虑把刚才式子中\([x=0]\)换成\([x=k-1]\)会怎样? 依然采取构造系数的思路,得出的结果是: \(f[x]=(-1)^{x-k}{x-1\choose k-1}\).

问题相当于求第\(K\)大的期望,所以可以转化成子集最小值: \(\text{kthmax}(S)=\sum_{T\in S}(-1)^{|T|-K}{|T|-1\choose k-1}\min(T)=\sum_{T\in S}\frac{m}{p_T}(-1)^{|T|-K}{|T|-1\choose k-1}\), 其中\(p_T=\sum_{i\in T} p_i\)

这个东西可以用一个dp来搞: 设\(dp[i][j][k]\)表示前\(i\)个数\(p\)之和为\(j\), 当组合数的下指标为\(k\)时每种方案乘以容斥系数之和。

考虑转移: 如果第\(i\)个元素不属于\(T\), 显然是加上\(dp[i-1][j][k]\); 如果属于\(T\), 那么要求的组合数\({|T|-1\choose k-1}={|T|-2\choose k-1}+{|T|-2\choose k-2}\), 对于前一项直接是\(dp[i-1][j-p_i][k]\), 对于后一项因为是从\(k-1\)转移过来,所以要多乘个\(-1\), 最终结果是减去\((dp[i-1][j-p_i][k]-dp[i-1][j-p_i][k-1])\).

然而这个dp的边界问题很难处理。这时我们不妨脱离实际问题,去思考一下组合数在指标为负数时的定义,直接代入可得\(dp[0][0][k]=-1 (k>0)\).

(然而感觉这种边界设置方法并不严谨)

时间复杂度\(O(nm(n-k))\).

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<iostream>
#define llong long long
using namespace std; inline int read()
{
int x=0; bool f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
if(f) return x;
return -x;
} const int N = 1000;
const int S = 1e4;
const int M = 11;
const int P = 998244353;
llong quickpow(llong x,llong y)
{
llong cur = x,ret = 1ll;
for(int i=0; y; i++)
{
if(y&(1ll<<i)) {y-=(1ll<<i); ret = ret*cur%P;}
cur = cur*cur%P;
}
return ret;
}
llong mulinv(llong x) {return quickpow(x,P-2);} llong a[N+3];
llong dp[S+3][M+2];
int n,m,s; int main()
{
scanf("%d%d%d",&n,&m,&s); m = n-m+1;
for(int i=1; i<=n; i++) scanf("%lld",&a[i]);
for(int i=1; i<=m; i++) dp[0][i] = P-1;
for(int i=1; i<=n; i++)
{
for(int j=s; j>=a[i]; j--)
{
for(int k=1; k<=m; k++)
{
dp[j][k] = (dp[j][k]+dp[j-a[i]][k-1]-dp[j-a[i]][k]+P)%P;
}
}
}
llong ans = 0ll;
for(int i=1; i<=s; i++)
{
ans = (ans+dp[i][m]*s%P*mulinv(i))%P;
}
printf("%lld\n",ans);
return 0;
}

Luogu P4707 重返现世 (拓展Min-Max容斥、DP)的更多相关文章

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

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

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

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

  3. Luogu P4707 重返现世

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

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

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

  5. 洛谷 P4707 重返现世

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

  6. 【BZOJ3622】已经没有什么好害怕的了 容斥+DP

    [BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...

  7. HDU 5794 A Simple Chess (容斥+DP+Lucas)

    A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...

  8. [CF1086E]Beautiful Matrix(容斥+DP+树状数组)

    给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...

  9. $bzoj2560$ 串珠子 容斥+$dp$

    正解:容斥+$dp$ 解题报告: 传送门$QwQ$ $umm$虽然题目蛮简练的了但还是有点难理解,,,我再抽象一点儿,就说有$n$个点,点$i$和点$j$之间有$a_{i,j}$条无向边可以连,问有多 ...

随机推荐

  1. 【pytorch】学习笔记(一)-张量

    pytorch入门 什么是pytorch PyTorch 是一个基于 Python 的科学计算包,主要定位两类人群: NumPy 的替代品,可以利用 GPU 的性能进行计算. 深度学习研究平台拥有足够 ...

  2. 多表表与表关系 增删改查 admin

    今日内容 多表表与表关系 增删改查表数据 admin 多表操作 表与表关系 默认指向主键 可能是隐藏主键 djamgo1.1默认级联(models. SET NULL解除级联) 一对一 先建立少的一方 ...

  3. Codeforces 1221B. Knights

    传送门 看到棋盘上跳马,发现如果把棋盘黑白染色,那么每次移动都是从白点到黑点,从黑点到白点 所以直接根据黑白染色判断每个位置的马的颜色即可 #include<iostream> #incl ...

  4. c# 不让窗体显示在alt tab中

    protected override CreateParams CreateParams { get { const int WS_EX_APPWINDOW = 0x40000; const int ...

  5. JS基础_基本语法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. js文件的框架

    Ext.define("BeidaSoft.SFJCGL.rcjwgl.bdgl.BdglGrid", { extend : "BeidaSoft.XTGL.base.Q ...

  7. js之运算符其它运算符(三元运算符,逗号运算符,void运算符,typeof,delete运算符)

    Javascript支持很多其它的运算符,具体如下: 一.条件运算符(?:) 条件运算符是Javascript中唯一的三个操作数的三元运算符,有时会直接称做是“三元运算符”. 基本格式:conditi ...

  8. 多线程编程-- part5.1 互斥锁ReentrantLock

    ReentrantLock简介 Reentrantlock是一个可重入的互斥锁,又被称为独占锁. Reentrantlock:分为公平锁和非公平锁,它们的区别体现在获取锁的机制上是否公平.“锁”是为了 ...

  9. Js 将图片的绝对路径转换为base64编码

    转.... 我们可以使用canvas.toDataURL的方法将图片的绝对路径转换为base64编码:在这我们引用的是淘宝首页一张图片如下:  var img = "https://img. ...

  10. mysql数据库查询过程探究和优化建议

    查询过程探究 我们先看一下向mysql发送一个查询请求时,mysql做了什么? 如上图所示,查询执行的过程大概可分为6个步骤: 客户端向MySQL服务器发送一条查询请求 服务器首先检查查询缓存,如果命 ...