洛谷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\) 种情况. 对于剩余砝码求 ...
随机推荐
- Android WebView漏洞(转)
一.漏洞描述 近期,微信等多款安卓流行应用曝出高危挂马漏洞:只要点击好友消息或朋友圈中的一条网址,手机就会自动执行黑客指令,出现被安装恶意扣费软件.向好友 发送欺诈短信.通讯录和短信被窃取等严重后果. ...
- JavaEE笔记(十一)
Spring beans使用参数占位符(JDBC配置读取示例) beans.xml配置文件 <?xml version="1.0" encoding="UTF-8& ...
- MView的DDL查找:
Select dbms_metadata.get_ddl('MATERIALIZED_VIEW','MVIEW_NAME') from dual:
- 设计模式 笔记 责任链模式 chain of responsibility
//---------------------------15/04/25---------------------------- //Chain of responsibility 责任链----- ...
- 设计模式 笔记 工厂方法 Factory Methon
//---------------------------15/04/09---------------------------- //factory method 工厂方法-------对象创建型模 ...
- python中列表的常用操作增删改查
1. 列表的概念,列表是一种存储大量数据的存储模型. 2. 列表的特点,列表具有索引的概念,可以通过索引操作列表中的数据.列表中的数据可以进行添加.删除.修改.查询等操作. 3. 列表的基本语法 创建 ...
- Scrapy持久化存储
基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作; 执行输出指定格式进行存储:将爬 ...
- EntityFramework Core 2.x (ef core) 在迁移中自动生成数据库表和列说明
在项目开发中有没有用过拼音首字母做列名或者接手这样的项目? 看见xmspsqb(项目审批申请表)这种表名时是否有一种无法抑制的想肛了取名的老兄的冲动? 更坑爹的是这种数据库没有文档(或者文档老旧不堪早 ...
- mgo like的两种写法
实际上都是围绕正则来写的,看大家喜欢那种写法 package main import ( "fmt" "labix.org/v2/mgo" "labi ...
- 认识 Iconfont 以及什么是 .eot、.woff、.ttf、.svg
一.Iconfont 1. 概述 在前端作业中,二十年前只有页面中铺满文字就算上线产品,现如今,不加点俏皮的“图标”会让页面显得很 Low 很 Low. 图标 在写这篇文章之前,我一直以为上图中的 ...