【题解】洛谷P4707重返现世
在跨年的晚上玩手机被妈妈骂了赶来写题……呜呜呜……但是A题了还是很开心啦,起码没有把去年的题目留到明年去做ヾ(◍°∇°◍)ノ゙也祝大家2019快乐!
这题显然的 kth min-max 容斥就不说了,不会的还是百度吧……记录一下后面的 dp。感觉挺强强的,%题解……
首先,min - max 容斥的公式为 : \(max_{K}(S) = \sum_{T\subseteq S}(-1)^{|T|-K}\binom{|T|-1}{K-1}min(T)\)
但是最后面的 \(min(T)\) 显然不能 \(2 ^ {n}\) 枚举,但又是非线性的求和。所以我们需要一点不一样的dp……考虑到 \(n - K <= 10\),实际上也就是说在上面公式中出现的 \(\binom{|T| - 1}{K - 1}\) 中的 \(K - 1\) 最大不会超过 11。从这个地方入手,设 在前 \(x\) 个元素组成的集合中, \(g_{x, i, j}\) 为所有 \(min(T) = j\) 且 \(|T| = i\) 的子集的方案数,
而\(f_{x, j, k} = \sum_{i = 1}(-1)^{i - k}\binom{i - 1}{k - 1}*g_{x, i, j}\)
考虑向集合中加入第 \(i\) 个元素,不加入的直接继承上一次的。
加入的则需要分析一下(下面的就只讨论包含第 \(i\) 个元素的情况)
考虑从 \(f_{x - 1, j - v, k - 1}\) 转移过来(\(v\) 为 \(p[i]\))
分析:\(f_{x - 1, j - v, k - 1} = \sum_{i = 1}(-1)^{i - k + 1}\binom{i - 1}{k - 2}*g_{x - 1, i, j - v}\)
为了便于观察,我们尽量把 \(f_{x, j, k}\) 也写成一样的形式
\(f_{x, j, k} = \sum_{i = 1}(-1)^{i - k + 1}\binom{i}{k - 1}*g_{x - 1, i, j - v}\)
因为我们有 \(\binom{n}{m} = \binom{n - 1}{m}+\binom{n - 1}{m - 1}\)
所以 \(f_{x, j, k} - f_{x - 1, j- v, k - 1} = \sum_{i = 1}(-1)^{i - k + 1}\binom{i - 1}{k - 1}*g_{x, i, j - v} = -f_{x - 1, j - v, k}\)
所以,完整的式子是:
\(f_{x, j, k} = f_{x - 1, j, k} + f_{x - 1, j - v, k - 1} - f_{x - 1, j - v, k}\)
这样就可以愉快地递推啦。不过还有一个小小的细节,就是边界的问题。我们只需要每次保存 \(f_{x, 0, 0} = 1\) 即可,因为会从 \(0\) 转移出去的当且仅当 \(v = j\) 即集合中仅有一个元素时。此时显然有 \(f_{x, p[x], 1} = 1\)。
- #include <bits/stdc++.h>
- using namespace std;
- #define maxn 2005
- #define maxm 20000
- #define mod 998244353
- #define int long long
- int n, K, m, f[][maxm][];
- int ans, now, pre, p[maxn];
- int inv[maxm], finv[maxm], fac[maxm];
- int read()
- {
- int x = , k = ;
- char c; c = getchar();
- while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
- while(c >= '' && c <= '') x = x * + c - '', c = getchar();
- return x * k;
- }
- void Up(int &x, int y) { x = (x + y) % mod; if(x < ) x += mod; }
- void init()
- {
- fac[] = , inv[] = inv[] = ; finv[] = ;
- for(int i = ; i < maxm; i ++) fac[i] = fac[i - ] * i % mod;
- for(int i = ; i < maxm; i ++) inv[i] = (mod - mod / i) * inv[mod % i] % mod;
- for(int i = ; i < maxm; i ++) finv[i] = finv[i - ] * inv[i] % mod;
- }
- int C(int n, int m)
- {
- if(n < m || n < || m < ) return ;
- return fac[n] * finv[m] % mod * finv[n - m] % mod;
- }
- int Qpow(int x, int timer)
- {
- int base = ;
- for(; timer; timer >>= , x = x * x % mod)
- if(timer & ) base = base * x % mod;
- return base;
- }
- void DP()
- {
- now = , pre = ; f[pre][][] = ;
- for(int i = ; i <= n; i ++, swap(now, pre), f[pre][][] = )
- for(int j = ; j <= m; j ++)
- for(int k = ; k <= K; k ++)
- {
- f[now][j][k] = f[pre][j][k];
- if(j < p[i]) continue;
- Up(f[now][j][k], f[pre][j - p[i]][k - ]);
- Up(f[now][j][k], -f[pre][j - p[i]][k]);
- }
- }
- signed main()
- {
- n = read(), K = read(), m = read(); init();
- for(int i = ; i <= n; i ++) p[i] = read();
- K = n - K + ; DP();
- for(int i = ; i <= m; i ++)
- Up(ans, f[pre][i][K] * m % mod * inv[i] % mod);
- printf("%lld\n", ans);
- return ;
- }
【题解】洛谷P4707重返现世的更多相关文章
- 洛谷 P4707 重返现世
洛谷 P4707 重返现世 k-minimax容斥 有这一个式子:\(E(\max_k(S))=\sum_{T\subseteq S}(-1)^{|T|-k}C_{|T|-1}^{k-1}\min(T ...
- 洛谷P4707 重返现世(扩展MinMax容斥+dp)
传送门 我永远讨厌\(dp.jpg\) 前置姿势 扩展\(Min-Max\)容斥 题解 看纳尔博客去→_→ 咱现在还没搞懂为啥初值要设为\(-1\)-- //minamoto #include< ...
- [洛谷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 - 重返现世(扩展 Min-Max 容斥+背包)
题面传送门 首先看到这种求形如 \(E(\max(T))\) 的期望题,可以套路地想到 Min-Max 容斥 \(\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T| ...
- 题解 洛谷P5018【对称二叉树】(noip2018T4)
\(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- 题解-洛谷P4229 某位歌姬的故事
题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...
随机推荐
- nginx遇到的配置问题
配置的例子如下: server { listen ; server_name localhost; #kzjtrans-web location /kzjtrans-web/ { proxy_pass ...
- 通过Task异步加快对数组的运算
一.介绍 Task是.NetFramework3.0出现的,线程是基于线程池,然后提供了丰富的API. 先用AverageAssign方法把一组数据平均分成n组,再通过遍历n组数据,循环开Task多线 ...
- Go简单聊天
用Go简单实现网络通信 其余功能可以在这个模型上继续加,比如增加通信人数,实现聊天 server 端 package main import ( "fmt" "log&q ...
- 关于springcloud的一些问题总结.txt
@Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource source = new UrlBasedCo ...
- vue mock(模拟后台数据) +axios 简单实例(二)
需装上axios,build文件夹中webpack.dev.conf.js文件添加上vue mock配置的东东, 如,继(一) //组件<template> <div> &l ...
- codeforces 1140E Palindrome-less Arrays
题目链接:http://codeforces.com/contest/1140/problem/E 题目大意: 如果一个数组的存在一个奇数长的回文就不好. 不是不好的数组是好的. 你可以把-1用1到k ...
- $.each()用法
通过它,你可以遍历对象.数组的属性值并进行处理. 使用说明 each函数根据参数的类型实现的效果不完全一致: 1.遍历对象(有附加参数) $.each(Object, function(p1, p2) ...
- 第7讲:SQL Server简介
SQL Server是微软公司提供的一款关系数据库管理系统. 操作数据库有两种方式:SQL语句和可视化的SSMS,该文章所有操作均基于SSMS. 一.SSMS(SQL Server Managemen ...
- C++ 函数 内联函数
内联函数的功能和预处理宏的功能相似,在介绍内联函数之前,先介绍一下预处理宏.宏是简单字符替换,最常见的用法:定义了一个代表某个值的全局符号.定义可调用带参数的宏.作为一种约定,习惯上总是用大写字母来定 ...
- Daily Scrum (2015/10/21)
今天可以说是项目正式开始的第一天,由于大家缺乏做团队项目的经验,对TFS的使用都还不太熟悉,所以今天大家的主要工作是熟悉TFS的使用和对代码进行初步的理解.我们预计需要2-3天时间来理解透彻源代码.以 ...