题目链接

BZOJ5322

题解

意思就是使有序的排列尽量少

就是使相同的数尽量少

然后大力贪心即可

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define REP(i,n) for (register int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
#define res register
using namespace std;
const int maxn = 200005,maxm = 10200005,INF = 1000000000,P = 998244353;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int n,m,l,r,a[maxn];
int fac[maxm];
inline int qpow(int a,int b){
int ans = 1;
for (; b; b >>= 1,a = 1ll * a * a % P)
if (b & 1) ans = 1ll * ans * a % P;
return ans;
}
void init(){
fac[0] = 1;
for (res int i = 1; i < maxm; i++)
fac[i] = 1ll * fac[i - 1] * i % P;
}
int bac[maxm],tail;
int main(){
init();
int T = read(),ans;
while (T--){
n = read(); m = read(); l = read(); r = read(); ans = fac[n + m];
REP(i,n) a[i] = read();
sort(a + 1,a + 1 + n);
tail = 0; int cnt = 0,M = 0;
for (res int i = 1; i <= n; i++){
if (i != 1 && a[i] != a[i - 1]){
if (a[i - 1] >= l && a[i - 1] <= r){
bac[cnt]++,tail++,M = max(M,cnt);
}
else ans = 1ll * ans * qpow(fac[cnt],P - 2) % P;
cnt = 1;
}
else cnt++;
}
if (a[n] >= l && a[n] <= r){
bac[cnt]++,tail++,M = max(M,cnt);
}
else ans = 1ll * ans * qpow(fac[cnt],P - 2) % P;
bac[0] += r - l + 1 - tail;
for (res int i = 0; m; i++,M = max(M,i)){
if (M == i){
int tot = m / bac[i],lef = m - tot * bac[i];
ans = 1ll * ans * qpow(qpow(fac[i + tot],P - 2),bac[i] - lef) % P;
ans = 1ll * ans * qpow(qpow(fac[i + tot + 1],P - 2),lef) % P;
bac[i] = M = 0;
break;
}
if (bac[i] >= m){
bac[i + 1] += m;
bac[i] -= m;
m = 0;
}
else {
m -= bac[i];
bac[i + 1] += bac[i];
bac[i] = 0;
}
}
for (res int i = 0; i <= M; i++){
ans = 1ll * ans * qpow(qpow(fac[i],P - 2),bac[i]) % P;
bac[i] = 0;
}
printf("%d\n",ans);
}
return 0;
}

最新文章

  1. [转]svn 清理失败 (cleanup 失败) 的解决方法
  2. MVC代码中如何调用api接口
  3. Linux系统中配置jdk
  4. 【wikioi】1907 方格取数3(最大流+最大权闭合子图)
  5. Determining Equality of Objects
  6. Compress、tar、gzip、zcat、bzip2、bzcat、打包解压命令行
  7. Unity3D TouchScript 插件教程一
  8. PHP运行模式(cgi,fast-cgi,cli, ISAPI ,web模块模式)【转载】
  9. dbgrid数据显示和数据源不同
  10. C++通过ADO读写Excel文件
  11. nyoj 寻找最大数(二)
  12. Spring Boot 集成 Spring Security 实现权限认证模块
  13. C#编程(八十)---------- 异常类
  14. Socket 相关资料(随笔)
  15. ORA-00600: internal error code, arguments: [kcblasm_1], [103], [] bug
  16. C#写Excel(OleDB)
  17. 使用mysqlbinlog恢复指定表
  18. python-day71--django多表操作
  19. ZT 王国维先生“人生三大境界”的具体含义是什么?
  20. loadrunner获取毫秒及字符串替换实现

热门文章

  1. JS 控制文本框禁止输入例子
  2. Kubernetes-创建集群(四)
  3. CDH,CM下载
  4. 事务消息中心-TMC
  5. inline-block 空隙
  6. 【廖雪峰老师python教程】——OOP
  7. Qt 蓝牙部分翻译
  8. C++学习008-delete与delete[]的差别
  9. 开发react的一些记录
  10. mysql修改外部访问权限