因为不存在任意两个数相同,那么设糖果比药片大的组有 \(x\) 个,药片比糖果大的组有 \(y\) 个,那么我们有:

\[x + y = n, x - y = k
\]

即:

\[x = \frac{n + k}{2}, y = \frac{n - k}{2}
\]

估本题实质上是问有多少种方案使得糖果比药片大的组恰好有 \(\frac{n + k}{2}\) 个,也就是有 \(\frac{n + k}{2}\) 个糖果匹配了比他小的药片。因为选择的顺序是没有关系的,因此为了能方便的知道当前这个数有多少个比其小的数,我们将药片和糖果分别从小到大排好序,那么糖果更大的一定能选糖果比他小的能选的药片,于是我们可以考虑设计一个 \(dp\),令 \(dp_{i, j}\) 表示当前考虑完了前 \(i\) 个糖果,有 \(j\) 个糖果选择了比他小的药片,假设 \(cnt_i\) 表示比 \(i\) 号糖果小的药片有多少个,那么有转移:

\[dp_{i, j} = (cnt_i - j + 1) dp_{i - 1, j - 1} + dp_{i - 1, j}
\]

但是做完这个 \(dp\) 以后,我们发现 \(dp_{n, \frac{n + k}{2}}\) 并不是答案,因为实际上上面这个 \(dp\) 只确定了 \(\frac{n + k}{2}\) 个糖果比药片大的组的分组,剩下没有分组的糖果和药片并没有考虑进来,但是剩下的方案我们不能保证其刚好全都是药片比糖果大,因此直接这样计数是行不通的。

思考一下问题所在,剩下的位置可能会存在若干个糖果比药片大的组,而我们此时已经选定了 \(\frac{n + k}{2}\) 个组糖果一定比药片大。这像不像我们二项式反演中钦定一些位置一定合法,而其他位置随意的样子。于是我们可以考虑使用二项式反演解决这个问题。令 \(f_i\) 表示钦定有 \(i\) 个组糖果比药片大的方案,那么有:

\[f_i = dp_{n, i} \times (n - i)!
\]

按照二项式反演的套路再令 \(g_i\) 表示恰好有 \(i\) 个组糖果比药片大的方案,那么可以得到 \(f, g\) 之间的关系:

\[f_i = \sum\limits_{j = i} ^ n \binom{j}{i} g_j
\]

\[g_{\frac{n + k}{2}} = \sum\limits_{i = \frac{n + k}{2}} ^ n (-1) ^ {i - \frac{n + k}{2}} \dbinom{i}{\frac{n + k}{2}} dp_{n, i} \times (n - i)!
\]

直接计算即可。

#include<bits/stdc++.h>
using namespace std;
#define rep(i, l, r) for(int i = l; i <= r; ++i)
const int N = 2000 + 5;
const int Mod = 1000000000 + 9;
int n, k, ans, a[N], b[N], f[N], cnt[N], fac[N], C[N][N], dp[N][N];
int read(){
char c; int x = 0, f = 1;
c = getchar();
while(c > '9' || c < '0'){ if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int Inc(int a, int b){
return (a += b) >= Mod ? a - Mod : a;
}
int Dec(int a, int b){
return (a -= b) < 0 ? a + Mod : a;
}
int Mul(int a, int b){
return 1ll * a * b % Mod;
}
int main(){
n = read(), k = read();
rep(i, 1, n) a[i] = read();
rep(i, 1, n) b[i] = read();
sort(a + 1, a + n + 1), sort(b + 1, b + n + 1);
rep(i, 1, n){
if(b[n] <= a[i]){ cnt[i] = n; continue;}
rep(j, 1, n) if(b[j] > a[i]){ cnt[i] = j - 1; break;}
}
fac[0] = C[0][0] = 1;
rep(i, 1, n) fac[i] = Mul(fac[i - 1], i), C[i][0] = 1;
rep(i, 1, n) rep(j, 1, i) C[i][j] = Inc(C[i - 1][j - 1], C[i - 1][j]);
dp[0][0] = 1;
rep(i, 1, n) rep(j, 0, min(i, cnt[i])){
dp[i][j] = dp[i - 1][j];
if(j) dp[i][j] = Inc(dp[i][j], Mul(dp[i - 1][j - 1], cnt[i] - j + 1));
}
rep(i, 0, n) f[i] = Mul(dp[n][i], fac[n - i]);
rep(i, (n + k) / 2, n){
if((i + (n + k) / 2) & 1) ans = Dec(ans, Mul(C[i][(n + k) / 2], f[i]));
else ans = Inc(ans, Mul(C[i][(n + k) / 2], f[i]));
}
printf("%d", ans);
return 0;
}

洛谷P4859 已经没有什么好害怕的了的更多相关文章

  1. 题解-洛谷P4859 已经没有什么好害怕的了

    洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...

  2. 洛谷 P4859 已经没有什么好害怕的了 解题报告

    已经没有什么好害怕的了 题目描述 已经使\(\tt{Modoka}\)有签订契约,和自己一起战斗的想法后,\(\tt{Mami}\)忽然感到自己不再是孤单一人了呢. 于是,之前的谨慎的战斗作风也消失了 ...

  3. 洛谷P4859 已经没有什么好害怕的了 [DP,容斥]

    传送门 思路 大佬都说这是套路题--嘤嘤嘤我又被吊打了\(Q\omega Q\) 显然,这题是要\(DP\)的. 首先思考一下性质: 为了方便,下面令\(k=\frac{n+k}{2}\),即有恰好\ ...

  4. 洛谷4859 BZOJ3622 已经没什么好害怕的了(DP,二项式反演)

    题目链接: 洛谷 BZOJ 题目大意:有两个长为 $n$ 的序列 $a,b$,问有多少种重排 $b$ 的方式,使得满足 $a_i>b_i$ 的 $i$ 的个数比满足 $a_i<b_i$ 的 ...

  5. 洛谷 P4859 && BZOJ3622: 已经没有什么好害怕的了

    题目描述 给出 \(n\) 个数 \(a_i\)​ ,以及 \(n\) 个数 \(b_i\)​ ,要求两两配对使得 \(a>b\) 的对数减去 \(a<b\) 的对数等于 \(k\) . ...

  6. 洛谷 P2046 BZOJ 2007 海拔(NOI2010)

    题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个 ...

  7. 洛谷P1434滑雪讲解

    题源:[戳这里] 洛谷博客链接:[戳这里] 我觉得这道题主要方法应该有两种: 动态规划 搜索 下面会分别对这两种方法进行简述 一,动态规划法首先的想法是用L(i,j)表示从点(i,j)出发能到达的最长 ...

  8. 洛谷P1525 关押罪犯(并查集、二分图判定)

    本人蒟蒻,只能靠题解AC,看到大佬们的解题思路,%%%%%% https://www.luogu.org/problemnew/show/P1525 题目描述 S城现有两座监狱,一共关押着N名罪犯,编 ...

  9. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

随机推荐

  1. A Deep Neural Network’s Loss Surface Contains Every Low-dimensional Pattern

    目录 概 相关工作 主要内容 引理1 定理1 定理2 A Deep Neural Network's Loss Surface Contains Every Low-dimensional Patte ...

  2. Spring练习,使用Properties类型注入方式,注入MySQL数据库连接的基本信息,然后使用JDBC方式连接数据库,模拟执行业务代码后释放资源,最后在控制台输出打印结果。

    相关 知识 >>> 相关 练习 >>> 实现要求: 使用Properties类型注入方式,注入MySQL数据库连接的基本信息,然后使用JDBC方式连接数据库,模拟执 ...

  3. http协议的状态码400,401,403,404,500,502,503,301,302等常见网页错误代码

    1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态码. 100(继续) 请求者应当继续提出请求.服务器返回此代码表示已收到请求的第一部分,正在等待其余部分. 101(切换协议) 请求者已要求 ...

  4. 编写Java程序,使用 dom4j 解析上一节王者荣耀“英雄”对应的Xml文件数据内容,打印输出,具体格式

    查看本章节 查看作业目录 需求说明: 使用 dom4j 解析上一节王者荣耀"英雄"对应的Xml文件数据内容,打印输出,具体格式如图所示 实现思路: 创建ParseHeroXML用于 ...

  5. Python项目生成requirements.txt文件及pip升级问题解决及流程

    缘由:新项目使用Python, PC上的python包不全,需要通过requirements.txt文件指定安装所需包 pip安装遇到一些坑 一.直接使用pip包管理工具生成requirements. ...

  6. EasySharding.EFCore 如何设计使用一套代码完成的EFCore Migration 构建Saas系统多租户不同业务需求且满足租户自定义分库分表、数据迁移能力?

    下面用一篇文章来完成这些事情 多租户系统的设计单纯的来说业务,一套Saas多租户的系统,面临很多业务复杂性,不同的租户存在不同的业务需求,大部分相同的表结构,那么如何使用EFCore来完成这样的设计呢 ...

  7. SpringMVC 解析(一)概览

    Spring MVC是Spring提供的构建Web应用程序的框架,该框架遵循了Servlet规范,负责接收并处理Servelt容器传递的请求,并将响应写回Response.Spring MVC以Dis ...

  8. 【Java】代码块

    代码块 代码块的作用:用来初始化类.对象 代码块如果有修饰的话,只能使用static 分类:静态代码块.非静态代码块 静态代码块 static{ } 内部可以有输出语句 随着类的加载而执行,而且只执行 ...

  9. python中grpc配置asyncio使用

    python中grpc配置asyncio使用 安装grpclib pip3 install grpclib protoc编译.proto文件,生成源码文件 python -m grpc_tools.p ...

  10. golang中的标准库context解读

    简介 golang 中的创建一个新的 goroutine , 并不会返回像c语言类似的pid,所有我们不能从外部杀死某个goroutine,所有我就得让它自己结束,之前我们用 channel + se ...