BZOJ5322: [JXOI2018]排序问题
传送门
不难看出期望就是 \(\frac{(n+m)!}{\prod_{v=1}^{max}(cnt_v!)}\),\(cnt_v\) 表示 \(v\) 这个数出现的次数。
贪心就是直接把 \(m\) 个数字每次选择一个 \(cnt\) 最小的加入,使得最后 \([l,r]\) 内每个数字出现的次数尽量平均。
直接按照数字出现的次数排序,从大到小枚举平均的次数是多少即可。
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn(2e5 + 5);
const int mod(998244353);
inline void Inc(int &x, const int y) {
x = x + y >= mod ? x + y - mod : x + y;
}
inline int Pow(ll x, int y) {
ll ret = 1;
for (; y; y >>= 1, x = x * x % mod)
if (y & 1) ret = ret * x % mod;
return ret;
}
int n, m, l, r, a[maxn], val[maxn], cnt[maxn], tot, ans;
int fac[(int)1e7 + maxn];
inline void Solve() {
int i, len, facn;
scanf("%d%d%d%d", &n, &m, &l, &r), len = r - l + 1;
for (i = 1; i <= n; ++i) scanf("%d", &a[i]);
sort(a + 1, a + n + 1), facn = fac[n + m];
for (i = 1, tot = 0; i <= n; ++i) {
if (a[i] != val[tot]) val[++tot] = a[i], cnt[tot] = 0;
++cnt[tot];
}
n = tot, ans = 1, tot = 0;
for (i = 1; i <= n; ++i)
if (val[i] < l || val[i] > r) ans = (ll)ans * fac[cnt[i]] % mod;
else cnt[++tot] = cnt[i], m += cnt[i];
sort(cnt + 1, cnt + tot + 1);
for (i = tot; ~i; --i) {
if (m / len >= cnt[i]) {
ans = (ll)Pow(fac[m / len + 1], m % len) * ans % mod * Pow(fac[m / len], len - m % len) % mod;
break;
}
m -= cnt[i], --len, ans = (ll)ans * fac[cnt[i]] % mod;
}
ans = (ll)Pow(ans, mod - 2) * facn % mod;
printf("%d\n", ans);
}
int main() {
int i, mx = 1e7 + 2e5;
for (i = fac[0] = 1; i <= mx; ++i) fac[i] = (ll)fac[i - 1] * i % mod;
scanf("%d", &mx);
while (mx--) Solve();
return 0;
}
BZOJ5322: [JXOI2018]排序问题的更多相关文章
- BZOJ5322 JXOI2018排序问题
对于一个序列,重排后有序的概率显然是∏cnti!/n!,其中cnti为第i种数出现次数.要使概率最小,显然应该让各种数字尽量平均分配.剩下的是div2BC左右的大讨论. #include<ios ...
- BZOJ5322 [Jxoi2018]排序问题 【贪心】
题目链接 BZOJ5322 题解 意思就是使有序的排列尽量少 就是使相同的数尽量少 然后大力贪心即可 #include<algorithm> #include<iostream> ...
- 【BZOJ5322】[JXOI2018]排序问题(模拟)
[BZOJ5322][JXOI2018]排序问题(模拟) 题面 BZOJ 洛谷 题解 这题就显得很呆. 显然就是每次找到\([l,r]\)中出现次数最小的那个数并且放一个. 然后随便模拟一下就好了Qw ...
- 5322: [Jxoi2018]排序问题
5322: [Jxoi2018]排序问题 链接 分析: 每次选一个出现次数最小的. 代码: #include<cstdio> #include<algorithm> #incl ...
- BZOJ5322:[JXOI2018]排序问题——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5322 https://loj.ac/problem/2543 <-可以看数据,要没有这数据我 ...
- 并不对劲的bzoj5322:loj2543:p4561:[JXOI2018]排序问题
题目大意 \(T\)(\(T\leq10^5\))组询问 每次给出\(n,m,l,r\),和\(n\)个数\(a_1,a_2,...,a_n\),要找出\(m\)个可重复的在区间\([l,r]\)的数 ...
- 洛谷P4561 [JXOI2018]排序问题(二分 期望)
题意 题目链接 Sol 首先一种方案的期望等于它一次排好的概率的倒数. 一次排好的概率是个数数题,他等于一次排好的方案除以总方案,也就是\(\frac{\prod cnt_{a_i}!}{(n+m)! ...
- [JXOI2018]排序问题
嘟嘟嘟 这是今天做的第二道九条可怜的题,现在对他的题的印象是:表面清真可做,实则毒瘤坑人. 首先要感谢吉司机,我期望学的特烂,好在样例直接告诉我们期望怎么求了. 令\(b_i\)表示第\(i\)个不同 ...
- yyb省选前的一些计划
突然意识到有一些题目的计划,才可以减少大量查水表或者找题目的时间. 所以我决定这样子处理. 按照这个链接慢慢做. 当然不可能只做省选题了. 需要适时候夹杂一些其他的题目. 比如\(agc/arc/cf ...
随机推荐
- Linux巩固记录(4) 运行hadoop 2.7.4自带demo程序验证环境
本节主要使用hadoop自带的程序运行demo来确认环境是否正常 1.首先创建一个input.txt文件,里面任意输入些单词,有部分重复单词 2.将input文件拷贝到hdfs 3.执行hadoop程 ...
- mybatis四大接口之 ResultSetHandler
1. 继承结构 2. ResultSetHandler public interface ResultSetHandler { // 将Statement执行后产生的结果集(可能有多个结果集)映射为结 ...
- 将Python项目打包成EXE可执行文件(单文件,多文件,包含图片)
解决 将Python项目打包成EXE可执行文件(单文件,多文件,包含图片) 1.当我们写了一个Python的项目时,特别是一个GUI项目,我们特备希望它能成为一个在Windows系统可执行的EXE文件 ...
- WebDriver高级应用实例(10)
10.1控制HTML5语言实现的视频播放器 目的:能够获取html5语言实现的视频播放器视频文件的地址.时长.控制进行播放暂停 被测网页的网址: http://www.w3school.com.cn/ ...
- 插入排序的Java代码实现
插入排序也是一类非常常见的排序方法,它主要包含直接插入排序,Shell排序和折半插入排序等几种常见的排序方法. 1.直接插入排序 直接插入排序的思路非常简单:依次将待排序的数据元素按其关键字值的大小插 ...
- webgl之观察三维空间
在之前的教程中,我们已经接触到了3d的基本应用,而这里,将会继续介绍两种不同的相机,即透视相机和正投影相机:还会学习设置相机的不同参数,这样就可以使场景以不同的角度显示出来. 一.正投影和透视投影概念 ...
- RVM的安装和使用过程中碰到的问题
Ruby Version Manager简称RVM,是一款非常好用的ruby版本管理以及安装工具. 关于rvm的安装,可以参考以下文章: use rvm install and manage ruby ...
- Android下用Sqlite数据库存储数据
第一步: 写个类 ,继承 SQLiteOpenHelper public class MyDatabaseOpenHelper extends SQLiteOpenHelper { } 第二步: ...
- Chapter 2 Open Book——13
"People in this town," he muttered. "Dr. Cullen is a brilliant surgeon who could prob ...
- 软件架构设计学习总结(15):远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比
总结这些概念都是易混淆,最基本概念定义复习和深入理解,同时也是架构师必备课程 RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请 ...