题目链接

戳我

\(Solution\)

\(50\ pts\)

我们来看一下题目,可以很容易的写出来答案的式子:

\[\frac{(n+m)!}{a_1!a_2!...a_{tot}!}
\]

\(a_1,a_2,...,a_{tot}\)为\(n+m\)个数中不同的数出现的个数

那么\(50\)便很好想了.

我们现在要求的是期望轮数最多,所以\({a_1!a_2!...a_{tot}!}\)要尽量小

所以我们可以贪心求解,每次找出\([l,r]\)中出现次数最少的数,找\(m\)次即可,这用个堆维护一下就好了

\(100 \ pts\)

我们还是需要\({a_1!a_2!...a_{tot}!}\)尽量小

于是我们可以二分出\(a_1,a_2,...,a_{tot}\)中的最小值的最大值,我们令这个值为\(ans\)

那么我们现在就可以知道了\(a_1,a_2,...,a_{tot}\)的分布

对于\(>ans\)的或不在[l,r]这个区间内的,直接将他们阶乘乘起来即可.

对于[l,r]内个数\(<=ans\)的,进行如下操作:

算出将[l,r]内个数\(<=ans\)的边成\(ans\)后剩下\(m\)个数还剩下几个.我们令这个数为\(c\),[l,r]内去见个数\(<=ans\)的数有\(k\)个

我们将这\(c\)个数分成不同的\(c\)个插入数列即可.

所以现在的个数为:

\(c\) 个个数为 \(ans+1\)

\(k-c\)个个数为 \(ans\)

直接快速幂求,最后吧求的乘起来,用\((n+m)!\)除他就好了.

\(Code\)

#include<bits/stdc++.h>
#define int long long
#define rg register
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
const int mod=998244353;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return f*x;
}
int n,m,tot,a[2000010],sum[2000010];
inline int check(int x,int len){
int ans=0,flag=0;
for(int i=1;i<=tot;i++){
if(sum[i]>x)
break;
ans+=sum[i],flag=i;
}
int k=(len-tot+flag);
return m-(k*x-ans);
}
inline int ksm(int a,int b){
int ans=1;
while(b){
if(b&1)
ans=ans*a%mod;
a=a*a%mod,b>>=1;
}
return ans;
}
int jc[20000010];
main(){
int T=read(),l,r;
jc[0]=1;
for(int i=1;i<=10200000;i++)
jc[i]=jc[i-1]*i%mod;
while(T--){
n=read(),m=read(),l=read(),r=read(),tot=0;
for(int i=1;i<=n;i++)
a[i]=read();
sort(a+1,a+1+n);
int p=0,js=1;
a[n+1]=-2147483647;
for(int i=1;i<=n+1;i++){
if(a[i]!=a[i+1]){
if(a[i]<=r&&a[i]>=l)
sum[++tot]=i-p;
else js=js*jc[(i-p)]%mod;
p=i;
}
}
sort(sum+1,sum+1+tot);
int L=0,R=m+n,maxx=0;
while(L<=R){
int mid=(L+R)>>1;
if(check(mid,(r-l+1))>=0)
L=mid+1,maxx=max(maxx,mid);
else R=mid-1;
}
int ans=0,flag=0,len=(r-l+1);
for(int i=1;i<=tot;i++) {
if(sum[i]>maxx) break;
ans+=sum[i],flag=i;
}
int k=(len-tot+flag),c=m-(k*maxx-ans);
for(int i=flag+1;i<=tot;i++) js=js*jc[sum[i]]%mod;
js=js*ksm(jc[maxx+1],c)%mod,js=js*ksm(jc[maxx],k-c)%mod;
printf("%lld\n",jc[n+m]*ksm(js,mod-2)%mod);
}
return 0;
}

「JXOI 2018」 排序问题的更多相关文章

  1. LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)

    写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...

  2. LOJ #2802. 「CCC 2018」平衡树(整除分块 + dp)

    题面 LOJ #2802. 「CCC 2018」平衡树 题面有点难看...请认真阅读理解题意. 转化后就是,给你一个数 \(N\) ,每次选择一个 \(k \in [2, N]\) 将 \(N\) 变 ...

  3. LOJ #2541. 「PKUWC 2018」猎人杀(容斥 , 期望dp , NTT优化)

    题意 LOJ #2541. 「PKUWC 2018」猎人杀 题解 一道及其巧妙的题 , 参考了一下这位大佬的博客 ... 令 \(\displaystyle A = \sum_{i=1}^{n} w_ ...

  4. LOJ #2540. 「PKUWC 2018」随机算法(概率dp)

    题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 ...

  5. LOJ #2538. 「PKUWC 2018」Slay the Spire (期望dp)

    Update on 1.5 学了 zhou888 的写法,真是又短又快. 并且空间是 \(O(n)\) 的,速度十分优秀. 题意 LOJ #2538. 「PKUWC 2018」Slay the Spi ...

  6. 「TJOI 2018」教科书般的亵渎

    「TJOI 2018」教科书般的亵渎 题目描述 小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为 \(a_i\) ,且每个怪物血量均不相同, 小豆手里有无限张"亵渎" ...

  7. 「TJOI 2018」游园会 Party

    「TJOI 2018」游园会 Party 题目描述 小豆参加了 \(NOI\) 的游园会,会场上每完成一个项目就会获得一个奖章,奖章只会是 \(N, O, I\) 的字样. 在会场上他收集到了 \(K ...

  8. 「SDOI 2018」反回文串

    题目大意: 求字符集大小为$k$长度为$n$的经循环移位后为回文串的数量. 题解: 这题是D1里最神的吧 考虑一个长度为$n$回文串,将其循环移位后所有的串都是满足要求的串. 但是显然这样计算会算重. ...

  9. 「WC 2018」州区划分

    题目大意: 给一个无向图$G(V,E)$满足$|V|<=21$,对于某一种将$G(V,E)$划分为k个的有序集合方案,若每一个子集$G_i(V_i,E_i)$,$E_i=\{(x,y)|x\in ...

随机推荐

  1. 配置git 环境变量

    1.从Git官网下载windows版本的git:http://git-scm.com/downloads 2.一般使用默认设置即可:一路next,git安装完毕! 3.但是如果这时你打开windows ...

  2. Linux服务管理 systemctl命令详解

    Linux服务器,服务管理--systemctl命令详解,设置开机自启动 syetemclt就是service和chkconfig这两个命令的整合     任务 旧指令 新指令 使某服务自动启动 ch ...

  3. 201671010127 2016-2017-11 Java图形用户界面设计技术

    一.事件处理器 1.什么是事件处理 一个事件要求特定的动作被执行,它被作为消息由外界或系统自身发送给GUI系统.这些事件包括来自计算机设备如鼠标键盘和网络端口的I/O中断,以及GUI系统的逻辑事件触发 ...

  4. Color, Material, Lighting

    [Color, Material, Lighting] The material and lighting parameters are used to control the built-in ve ...

  5. 在SharePoint解决方案中使用JavaScript (2) – 模块化

    本文是在SharePoint中使用JavaScript的第二篇文章,前面的文章包括: 在SharePoint解决方案中使用JavaScript (0) 在SharePoint解决方案中使用JavaSc ...

  6. 273. Integer to English Words数字转为单词

    [抄题]: Convert a non-negative integer to its english words representation. Given input is guaranteed ...

  7. python2.7 跨文件全局变量的方法-乾颐堂

    在使用Python编写的应用的过程中,有时会遇到多个文件之间传递同一个全局变量的情况. 文件1:globalvar.py 1 2 3 4 5 6 7 8 9 10 11 12 #!/usr/bin/e ...

  8. realsense pcl git

    https://github.com/Ext4FAT/Registration vc++ pcl realsense  矿泉水瓶子 https://github.com/dBeker/PCL-Real ...

  9. SpringMVC 2.5.6 +Hibernate 3.2.0

    spring MVC配置详解 现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时 ...

  10. WCF和ASP.NET Web API在应用上的选择(转)

    出处:http://www.cnblogs.com/shanyou/archive/2012/09/26/2704814.html 在最近发布的Visual Studio 2012及.NET 4.5中 ...