题目链接:

洛谷

BZOJ

题目大意:有两个长为 $n$ 的序列 $a,b$,问有多少种重排 $b$ 的方式,使得满足 $a_i>b_i$ 的 $i$ 的个数比满足 $a_i<b_i$ 的 $i$ 的个数恰好多 $k$ 个。答案对 $10^9+9$ 取模。

$1\le n\le 2000,0\le k\le n$。保证 $a,b$ 中没有相同的数。


首先根据小学数学知识可知,$a_i>b_i$ 的个数应该是 $\frac{n+k}{2}$。如果 $n+k$ 不是偶数那么就无解。

那么就可以DP了。首先将 $a$ 和 $b$ 分别排序,令 $c_i$ 表示 $b$ 中 $<a_i$ 的数的个数。

设 $dp_{i,j}$ 表示在前 $i$ 个 $a$ 中,选了 $j$ 个 $a$ 和 $j$ 个 $b$ 并凑出了恰好 $j$ 对满足 $a>b$ 的对的方案数,那么有:

$dp_{i,0}=1$

$dp_{i,j}=dp_{i-1,j}+dp_{i-1,j-1}(c_i-j+1)$

解释一下第二句,前半部分是表示 $a_i$ 不找,后半部分表示 $a_i$ 找。本来可以有 $c_i$ 个 $b$ 可以选,但是前面 $j-1$ 个 $i$ 已经选了 $j-1$ 个了。又因为 $a$ 从小到大,所以还可以选 $c_i-j+1$ 个。

令 $f_k$ 为恰好 $k$ 对数的答案, $g_k$ 为至少 $k$ 对数的答案。

我们发现 $g_k$ 比较好算,$g_k=dp_{n,k}(n-k)!$。因为选出了 $k$ 对之后,剩下的可以随便搭配。

然后又可以发现 $g_k=\sum\limits^n_{i=k}{i\choose k}f_i$。为什么???因为这题标签是二项式反演啊……(smg……)

好吧,我不会证,直接用吧(逃

那么 $f_k=\sum\limits^n_{i=k}(-1)^{i-k}{i\choose k}g_i$。

时间复杂度 $O(n^2)$。


upd:问了PBdalao为什么是组合数,把他的话放这吧:

对于 $j$ 的一个方案,它在 $i$ 中必然是这么统计的:有 $i$ 个是DP得到的,另外 $j-i$ 个是后面乱搞得到的。

所以 $j$ 中每一组 $i$ 都被统计了一次,最后就被统计了 $j\choose i$ 次。

(很有道理,不是吗?)


代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=,mod=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
char ch=getchar();int x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,k,a[maxn],b[maxn],c[maxn],dp[maxn][maxn],fac[maxn],inv[maxn],invfac[maxn];
inline int C(int n,int m){
return 1ll*fac[n]*invfac[m]%mod*invfac[n-m]%mod;
}
inline int g(int x){
return 1ll*dp[n][x]*fac[n-x]%mod;
}
inline int f(int x){
int ans=;
FOR(i,x,n){
int v=1ll*C(i,x)*g(i)%mod;
if((i-x)&) ans=(ans-v+mod)%mod;
else ans=(ans+v)%mod;
}
return ans;
}
int main(){
n=read();k=read();
if((n+k)&) return puts(""),;
k=(n+k)>>;
fac[]=fac[]=inv[]=invfac[]=invfac[]=;
FOR(i,,n){
fac[i]=1ll*fac[i-]*i%mod;
inv[i]=mod-1ll*(mod/i)*inv[mod%i]%mod;
invfac[i]=1ll*invfac[i-]*inv[i]%mod;
}
FOR(i,,n) a[i]=read();
FOR(i,,n) b[i]=read();
sort(a+,a+n+);sort(b+,b+n+);
int cur=;
FOR(i,,n){
while(cur<=n && b[cur]<a[i]) cur++;
c[i]=cur-;
}
dp[][]=;
FOR(i,,n){
dp[i][]=dp[i-][];
FOR(j,,i) dp[i][j]=(dp[i-][j]+1ll*dp[i-][j-]*(c[i]-j+))%mod;
}
printf("%d\n",f(k));
}

二项式反演

洛谷4859 BZOJ3622 已经没什么好害怕的了(DP,二项式反演)的更多相关文章

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

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

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

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

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

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

  4. 洛谷P3959 宝藏(NOIP2017)(状压DP,子集DP)

    洛谷题目传送门 Dalao的题解多数是什么模拟退火.DFS剪枝.\(O(3^nn^2)\)的状压DP之类.蒟蒻尝试着把状压改进了一下使复杂度降到\(O(3^nn)\). 考虑到每条边的贡献跟它所在的层 ...

  5. BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】

    题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...

  6. 【题解】洛谷P1541 [NOIP2010TG] 乌龟棋(类似背包的DP)

    题目来源:洛谷P1541 思路 类似背包的题 总之就是四种卡牌取的先后顺序不同导致的最终ans不同 所以我们用一个四维数组每一维分别表示第几种取了几张的最大分数 然后就是简单DP解决 代码 #incl ...

  7. BZOJ3622 已经没有什么好害怕的了 【dp + 二项式反演】

    题目链接 BZOJ3622 题解 既已开题 那就已经没有什么好害怕的了 由题目中奇怪的条件我们可以特判掉\(n - k\)为奇数时答案为\(0\) 否则我们要求的就是糖果大于药片恰好有\(\frac{ ...

  8. 洛谷P2216: [HAOI2007]理想的正方形 单调队列优化DP

    洛谷P2216 )逼着自己写DP 题意: 给定一个带有数字的矩阵,找出一个大小为n*n的矩阵,这个矩阵中最大值减最小值最小. 思路: 先处理出每一行每个格子到前面n个格子中的最大值和最小值.然后对每一 ...

  9. 洛谷P1441 砝码称重(搜索,dfs+dp)

    洛谷P1441 砝码称重 \(n\) 的范围为 \(n \le 20\) ,\(m\) 的范围为 \(m \le 4\) . 暴力遍历每一种砝码去除情况,共有 \(n^m\) 种情况. 对于剩余砝码求 ...

随机推荐

  1. spring-boot dubbo项目使用docker方式部署

    项目结构 本项目采用maven构建,有三个模块,分别是pms-interfaces, pms-services, pms-portal. 模块 描述 pms-interfaces 接口层,只能存放实体 ...

  2. go语言之行--数组、切片、map

    一.内置函数 append :追加元素到slice里,返回修改后的slice close :关闭channel delete :从map中删除key对应的value panic  : 用于异常处理,停 ...

  3. 20155229《网络对抗技术》Exp5:MSF基础应用

    实验内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 一个主动攻击实践,如ms08-067; 一个针对浏览器的攻击,如ms11-050: 一个针对 ...

  4. 20155238 实验四 Android程序设计

    Android 安装Android Studio 按照教程依次完成安装步骤.安装所存的相应文件夹必须纯英文,不能出现特殊字符. 32位系统和64位系统是同一个安装文件.启动程序中32位与64位都有.根 ...

  5. 2017-2018-4 20155317《网络对抗技术》EXP3 免杀原理与实践

    2017-2018-4 20155317<网络对抗技术>EXP3 免杀原理与实践 一.问题回答 (1)杀软是如何检测出恶意代码的?杀软是通过代码特征比对得出的,将检查的代码和自己的特征库的 ...

  6. 20155327 李百乾 Exp7 网络欺诈防范

    20155327 李百乾 Exp7 网络欺诈防范 基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 就此次试验来看,被收到NDSspoof攻击,首先要被攻击机扫描,并被设置为目标,所 ...

  7. 20155330 《网络攻防》 Exp3 免杀原理与实践

    20155330 <网络攻防> Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 基于特征码.先对流行代码特征的提取,然后进行程序的比对,如果也检测到相应的特征码的程序 ...

  8. Remote 桌面的win2003 servre端设定

    Microsoft Windows [版本 5.2.3790](C) 版权所有 1985-2003 Microsoft Corp. C:\Documents and Settings\Administ ...

  9. [摘抄]从 GitHub 身上学到的 3 个创业经验

    1.找一个大问题去解决 让 Git 更容易使用是 GitHub 的目标,但它从来不是 GitHub 的最终目标.GitHub 的真正目标是让协作和编写软件变得更容易.世界上每一个软件开发者都在努力解决 ...

  10. 初级字典树查找在 Emoji、关键字检索上的运用 Part-3

    系列索引 Unicode 与 Emoji 字典树 TrieTree 与性能测试 生产实践 生产实践 我们最终要解决 Emoji 在浏览器和打印物上的显示一致. 进行了多番对比,,在显示效果和精度上,m ...