洛谷4859 BZOJ3622 已经没什么好害怕的了(DP,二项式反演)
题目链接:
题目大意:有两个长为 $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,二项式反演)的更多相关文章
- 洛谷P4859 已经没有什么好害怕的了 [DP,容斥]
传送门 思路 大佬都说这是套路题--嘤嘤嘤我又被吊打了\(Q\omega Q\) 显然,这题是要\(DP\)的. 首先思考一下性质: 为了方便,下面令\(k=\frac{n+k}{2}\),即有恰好\ ...
- 题解-洛谷P4859 已经没有什么好害怕的了
洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...
- 洛谷 P4859 已经没有什么好害怕的了 解题报告
已经没有什么好害怕的了 题目描述 已经使\(\tt{Modoka}\)有签订契约,和自己一起战斗的想法后,\(\tt{Mami}\)忽然感到自己不再是孤单一人了呢. 于是,之前的谨慎的战斗作风也消失了 ...
- 洛谷P3959 宝藏(NOIP2017)(状压DP,子集DP)
洛谷题目传送门 Dalao的题解多数是什么模拟退火.DFS剪枝.\(O(3^nn^2)\)的状压DP之类.蒟蒻尝试着把状压改进了一下使复杂度降到\(O(3^nn)\). 考虑到每条边的贡献跟它所在的层 ...
- BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】
题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...
- 【题解】洛谷P1541 [NOIP2010TG] 乌龟棋(类似背包的DP)
题目来源:洛谷P1541 思路 类似背包的题 总之就是四种卡牌取的先后顺序不同导致的最终ans不同 所以我们用一个四维数组每一维分别表示第几种取了几张的最大分数 然后就是简单DP解决 代码 #incl ...
- BZOJ3622 已经没有什么好害怕的了 【dp + 二项式反演】
题目链接 BZOJ3622 题解 既已开题 那就已经没有什么好害怕的了 由题目中奇怪的条件我们可以特判掉\(n - k\)为奇数时答案为\(0\) 否则我们要求的就是糖果大于药片恰好有\(\frac{ ...
- 洛谷P2216: [HAOI2007]理想的正方形 单调队列优化DP
洛谷P2216 )逼着自己写DP 题意: 给定一个带有数字的矩阵,找出一个大小为n*n的矩阵,这个矩阵中最大值减最小值最小. 思路: 先处理出每一行每个格子到前面n个格子中的最大值和最小值.然后对每一 ...
- 洛谷P1441 砝码称重(搜索,dfs+dp)
洛谷P1441 砝码称重 \(n\) 的范围为 \(n \le 20\) ,\(m\) 的范围为 \(m \le 4\) . 暴力遍历每一种砝码去除情况,共有 \(n^m\) 种情况. 对于剩余砝码求 ...
随机推荐
- mfc CProgressCtrl
CProgressCtrl常用属性 CProgressCtrl类常用成员函数 CProgressCtrl代码示例 一.CProgressCtrl控件属性 当我们在处理大程序时,常常需要耗很长时间(比如 ...
- Hadoop日记系列目录
下面是Hadoop日记系列的目录,由于目前时间不是很充裕,以后的更新的速度会变慢,会按照一星期发布一期的原则进行,希望能和大家相互学习.交流. 目录安排 1> Hadoop日记Day1---H ...
- HDU 6333 Harvest of Apples (分块、数论)
题目连接:Harvest of Apples 题意:给出一个n和m,求C(0,n)+C(1,n)+.....+C(m,n).(样例组数为1e5) 题解:首先先把阶乘和逆元预处理出来,这样就可O(1)将 ...
- [arc076F]Exhausted?[霍尔定理+线段树]
题意 地上 \(1\) 到 \(m\) 个位置摆上椅子,有 \(n\) 个人要就座,每个人都有座位癖好:选择 \(\le L\) 或者 \(\ge R\) 的位置.问至少需要在两边添加多少个椅子能让所 ...
- 使用DOS工具修复数据库
当SQL Server 实例出现异常,无法远程链接时,数据库管理员需要登陆到SQL Server实例机器上,通过命令行工具,修复异常. 一,使用net命令行启动数据库 通过net start 命令启动 ...
- 基于.NET的3D开发框架/工具比较
好久木有写博客了,这么日子以来忙忙碌碌的,也没大有时间潜心学习和梳理.最近刚好接手一个3D显示的活,虽然还没怎么弄明白,但是也看过一些方案,走了一些弯路,经过一些浅显的了解(3D Display这里面 ...
- Hive的一些理解
首先谈一下关于hive和hbase的区别的疑问(完全不是一个东西): 本质上来说hive和hbase没什么关系,虽然都是表,查数据等,但是他们根本就不是一个层面的东西 hive就是一个rapduce的 ...
- 从头到尾谈一下HTTPS
引言 “你能谈一下HTTPS吗?” “一种比HTTP安全的协议.” “...” 如果面试这样说的话那差不多就gg了,其实HTTPS要展开回答的话内容还挺丰富的.本篇文章详细介绍了HTTPS是什么.为什 ...
- PAT甲题题解-1025. PAT Ranking (25)-排序
排序,求整体的排名和局部的排名整体排序,for循环一遍同时存储整体目前的排名和所在局部的排名即可 #include <iostream> #include <cstdio> # ...
- ajax设置自定义请求头
1, $.ajax({ url:apiUrl, type:"get", timeout : 5000, //超时时间设置,单位毫秒 dataType: "json&quo ...