点此看题面

大致题意: 有\(n\)个糖果和\(n\)个药片,各有自己的能量。将其两两配对,求糖果比药片能量大的组数恰好比药片比糖果能量大的组数多\(k\)组的方案数。

什么是广义容斥(二项式反演)

我们首先来介绍一下什么是广义容斥。

我们要证明下面这样一个式子:

\[f_n=\sum_{i=0}^nC_n^ig_i⇔g_n=\sum_{i=0}^n(-1)^{n-i}C_{n}^if_i
\]

观察右边这个式子,我们将\(f_n=\sum_{i=0}^nC_n^ig_i\)代入就可以得到:

\[g_n=\sum_{i=0}^n(-1)^{n-i}C_n^i\sum_{j=0}^i(-1)^jC_i^jg_j
\]

把\(C_n^i\)移入,可以得到:

\[g_n=\sum_{i=0}^n(-1)^{n-i}\sum_{j=0}^i(-1)^jC_n^iC_i^jg_j
\]

通过暴力展开我们可以证明\(C_n^iC_i^j=C_n^jC_{n-j}^{i-j}\),代入得:

\[g_n=\sum_{i=0}^n(-1)^{n-i}\sum_{j=0}^i(-1)^jC_n^jC_{n-j}^{i-j}g_j
\]

然后我们调换\(i\)和\(j\)的枚举顺序,并让\(i\)变为原先的\(n-i-j\)可得:

\[g_n=\sum_{j=0}^n(-1)^jC_n^jg_j\sum_{i=0}^{n-j}C_{n-j}^i(-1)^{i+j}
\]

然后代入二项式定理(因此这又称为二项式反演)\((x+y)^n=\sum_{i=0}^nC_n^ix^iy^{n-i}\)得:

\[g_n=\sum_{j=0}^n(-1)^{2j}C_n^jg_j(\sum_{i=0}^{n-j}C_{n-j}^i(-1)^i\cdot1^{n-j-i})=\sum_{j=0}^n(-1)^{2j}C_n^jg_j\cdot0^{n-j}
\]

由于式子中出现了一个\(0^{n-j}\),因此只有当\(n-j=0\),即\(n=j\)时,该式才有值,代入得:

\[g_n=(-1)^{2n}C_n^ng_n\cdot1=1\cdot1\cdot g_n\cdot1=g_n
\]

因此原式恒成立,得证。

简单转化

恰好多\(k\)组这个条件不是很好求,所以我们可以将其转化一下。

由于总数\(n\)是固定的,所以我们容易求出糖果比药片能量大的组数应为\(\frac{n+k}2\)。

动态规划

接下来,我们就要使用\(DP\)了。

首先,我们把糖果和药片分别按能量排一边序。

则这样可以保证后枚举到的的糖果所能胜过的药片的区间一定能覆盖先枚举到的糖果的区间。

然后,设\(f_{i,j}\)表示糖果匹配到第\(i\)个,且已经与\(j\)个药片匹配的方案数,并设\(g_i\)表示能与第\(i\)个糖果匹配的药片数,则我们可以推出转移方程为:

\[f_{i,j}=f_{i-1,j}+(g_i-j+1)f_{i-1,j-1}
\]

广义容斥

从前面\(DP\)得到的\(f_{n,i}\),我们可以轻松推得糖果大于药片的对数大于等于\(i\)的方案数

由于我们已经确定了\(i\)对,而剩下的\((n-i)\)对实际上可以随意匹配,因此便是一个全排列。即:

\[f_{n,i}(n-i)!
\]

我们可以设\(F_i\)表示糖果大于药片的对数恰好等于\(i\)的方案数,则可得:

\[f_{n,i}(n-i)!=\sum_{k=i}^nC_k^iF_k
\]

然后用先前提到的广义容斥,就可以得到:

\[F_k=\sum_{i=k}^n(-1)^{i-k}C_i^kf_{n,i}(n-i)!
\]

已知糖果比药片能量大的组数应为\(\frac{n+k}2\),则\(F_{\frac{n+k}2}\)即为答案。

而这可以直接求。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 2000
#define X 1000000009
#define Qinv(x) Qpow(x,X-2)
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
#define C(x,y) (1LL*Fac[x]*Inv[y]%X*Inv[(x)-(y)]%X)
using namespace std;
int n,k,a[N+5],b[N+5],g[N+5],Fac[N+5],Inv[N+5],f[N+5][N+5];
I int Qpow(RI x,RI y) {RI res=1;W(y) y&1&&(res=1LL*res*x%X),x=1LL*x*x%X,y>>=1;return res;}//快速幂
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define pc(c) (C^FS?FO[C++]=c:(fwrite(FO,1,C,stdout),FO[(C=0)++]=c))
#define tn(x) (x<<3)+(x<<1)
#define D isdigit(c=tc())
int T,C;char c,*A,*B,FI[FS],FO[FS],S[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn(x)+(c&15),D);}
Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
I void clear() {fwrite(FO,1,C,stdout),C=0;}
}F;
int main()
{
RI i,j,t,ans=0;for(F.read(n,k),i=1;i<=n;++i) F.read(a[i]);for(i=1;i<=n;++i) F.read(b[i]);//读入数据
for(sort(a+1,a+n+1),sort(b+1,b+n+1),i=1;i<=n;++i) {g[i]=g[i-1];W(g[i]^n&&a[i]>b[g[i]+1]) ++g[i];}//排序,然后求出g[i]
for(f[0][0]=i=1;i<=n;++i) for(j=0;j<=i;++j) f[i][j]=f[i-1][j],j&&Inc(f[i][j],1LL*f[i-1][j-1]*(g[i]-j+1)%X);//DP转移
for(Fac[0]=i=1;i<=n;++i) Fac[i]=1LL*Fac[i-1]*i%X;for(Inv[n]=Qinv(Fac[n]),i=n-1;~i;--i) Inv[i]=1LL*Inv[i+1]*(i+1)%X;//初始化阶乘及阶乘逆元
for(i=t=n+k>>1;i<=n;++i) Inc(ans,1LL*((i^t)&1?X-1:1)*C(i,t)%X*f[n][i]%X*Fac[n-i]%X);//求出最终答案
return F.write(ans),F.clear(),0;//输出答案
}

【BZOJ3622】已经没有什么好害怕的了(动态规划+广义容斥)的更多相关文章

  1. bzoj3622已经没有什么好害怕的了 dp+组合+容斥(?)

    3622: 已经没有什么好害怕的了 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1033  Solved: 480[Submit][Status][ ...

  2. BZOJ - 3622:已经没有什么好害怕的了 (广义容斥)

    [BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...

  3. 【BZOJ3622】已经没有什么好害怕的了(动态规划,容斥)

    [BZOJ3622]已经没有什么好害怕的了(动态规划,容斥) 题面 BZOJ 题解 很明显的,这类问题是要从至少变成恰好的过程,直接容斥即可. 首先我们要求的是(糖果>药片)=(药片>糖果 ...

  4. BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学

    原文链接https://www.cnblogs.com/zhouzhendong/p/9276479.html 题目传送门 - BZOJ3622 题意 给定两个序列 $a,b$ ,各包含 $n$ 个数 ...

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

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

  6. BZOJ 3622 : 已经没有什么好害怕的了(dp + 广义容斥原理)

    今天没听懂 h10 的讲课 但已经没有什么好害怕的了 题意 给你两个序列 \(a,b\) 每个序列共 \(n\) 个数 , 数之间两两不同 问 \(a\) 与 \(b\) 之间有多少配对方案 使得 \ ...

  7. 【BZOJ3622】已经没有什么好害怕的了 容斥+DP

    [BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...

  8. [BZOJ3622]已经没有什么好害怕的了(容斥DP)

    给定两个数组a[n]与b[n](数全不相等),两两配对,求“a比b大”的数对比“b比a大”的数对个数多k的配对方案数. 据说做了这题就没什么题好害怕的了,但感觉实际上这是一个套路题,只是很难想到. 首 ...

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

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

随机推荐

  1. 通过id、classname定位元素,程序仍报找不到元素的原因

    很多人在用selenium定位页面元素的时候会遇到定位不到的问题,明明元素就在那儿,用firebug也可以看到,就是定位不到,这种情况很有可能是frame在搞鬼.我们知道了原因,你现在就解决问题.sw ...

  2. vue(5)联动+tab页

    来自:https://juejin.im/post/5a0c191f6fb9a04514639419 1.联动 新增 <input v-model="msg" /> & ...

  3. C++ opencv 滑动条 Trackbary以及处理三通道和单通道图像

    #include <opencv2\core.hpp> #include <opencv2\highgui.hpp> #include <opencv2\imgproc. ...

  4. FCN用卷积层代替FC层原因(转)

    分类任务 CNN对于常见的分类任务,基本是一个鲁棒且有效的方法.例如,做物体分类的话,入门级别的做法就是利用caffe提供的alexnet的模型,然后把输出的全连接层稍稍修改称为自己想要的类别数,然后 ...

  5. shell中的命令与特殊符号

    1.记录命令:! !!:连续的“!”表示执行上一次的指令 !n:表示执行命令历史中第二条指令 注:!2居然给我关机了 !字符串(字符串大于1)表示执行命令历史中最近的一次 2.通配符 " * ...

  6. 信息领域热词分析系统--python过滤

    利用python过滤去没用的词语,过滤的词语存储在停用文件中. #创建停用词表 def stopwordlist(): stopwords=[line.strip() for line in open ...

  7. 注意mysql connector的版本

    今天把ubuntu升级到16.04后,使用mysql connector 1.1.8版本(centos 还是ubuntu不清楚)访问数据库,出现莫名其妙的错误. 后来下载mysql connector ...

  8. pat1050. String Subtraction (20)

    1050. String Subtraction (20) 时间限制 10 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Giv ...

  9. [巩固C#] 一、特性是什么东东

    阅读目录   关闭   前言 特性是什么? 那么什么是“元数据”? 特性到底是什么? 我们自定义一个特性玩玩 什么是命名参数? 我们来继续要看看AttributeUsage(这个描... 自定义特性可 ...

  10. golang and mogodb

    1.golang的mogodb包下载:http://gopkg.in/mgo.v2    http://gopkg.in/mgo.v2/bson 2.golang的mongodb操作(mgo):htt ...