传送门

见计数想容斥

首先题目可以简单转化一下, 求 糖果比药片能量大的组数比药片比糖果能量大的组数多 $k$ 组 的方案数

因为所有能量各不相同,所以就相当于求 糖果比药片能量大的组数为 $(n+k)/2$ 组的方案数,如果 $(n+k)$ 为奇数则无解

发现这个 '恰好' 很不好算,考虑先算出 '至少',设 $F[i]$ 表示至少有 $i$ 对糖果比药片大的方案数

那么就是要强制选 $i$ 对糖果比药片大,然后再随便选,发现这个强制选 $i$ 对糖果比药片大的方案数也不好算..

考虑先把糖果和药片排序,然后 $dp$

设 $f[i][j]$ 表示从小到大前 $i$ 个糖果,和药片匹配了 $j$ 对的方案数

那么 $f[i][j]=f[i-1][j]+f[i-1][j-1]*(g[i]-j+1)$,其中 $g[i]$ 表示比糖果 $i$ 能量小的药片的数量

然后 $f[n][i]$ 就是强制选 $i$ 对糖果比药片大的方案数,因为剩下的随便选,所以剩下方案数就是 $(n-i)!$

所以 $F[i]=f[n][i]*(n-i)!$(注意这里的 $F[i]$ 中其实有些方案是重复算了)

设恰好 $i$ 对糖果比药片大的方案数为 $ans[i]$,可以(不能)发现,对于 $F[i]=f[n][i]*(n-i)!$

$F[i]=\sum_{j=i}^{n}C_{j}^{i}\cdot ans[j]$ (乘 $C_{j}^{i}$ 是因为有重复算)

所以逆推 $ans[i]$,$ans[i]=F[i]-\sum_{j=i+1}^{n}C_{j}^{i}ans[j]$

然后就可以算了

具体看代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=,mo=1e9+;
int n,K;
int A[N],B[N],fac[N],C[N][N];
int cnt[N],f[N][N],ans[N];//cnt[i]是比糖果i小的药片的数量
inline int fk(int x) { return x>=mo ? x-mo : x; }
int main()
{
n=read(),K=read();
for(int i=;i<=n;i++) A[i]=read();
for(int i=;i<=n;i++) B[i]=read();
sort(A+,A+n+); sort(B+,B+n+);
if((n+K)&) { printf(""); return ; }//判断无解
int p=;
for(int i=;i<=n;i++)
{
cnt[i]=cnt[i-];
while(p<=n&&A[i]>B[p]) cnt[i]++,p++;
}
for(int i=;i<=n;i++) f[i][]=;//初始化
for(int i=;i<=n;i++)
for(int j=;j<=n;j++) f[i][j]=fk(f[i-][j] + 1ll*(cnt[i]-j+)*f[i-][j-]%mo );//dp
fac[]=; for(int i=;i<=n;i++) fac[i]=1ll*fac[i-]*i%mo;//求阶乘
C[][]=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
C[i+][j]=fk(C[i+][j]+C[i][j]);
C[i+][j+]=fk(C[i+][j+]+C[i][j]);//求组合数
}
for(int i=n;i>=(n+K)>>;i--)//逆推ans
{
ans[i]=1ll*f[n][i]*fac[n-i]%mo;
for(int j=i+;j<=n;j++) ans[i]=fk(ans[i]-1ll*C[j][i]*ans[j]%mo+mo);
}
printf("%d",ans[(n+K)>>]);
return ;
}

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

  1. P4859 已经没有什么好害怕的了(dp+二项式反演)

    P4859 已经没有什么好害怕的了 啥是二项式反演(转) 如果你看不太懂二项式反演(比如我) 那么只需要记住:对于某两个$g(i),f(i)$ ---------------------------- ...

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

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

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

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

  4. BZOJ 3622 Luogu P4859 已经没有什么好害怕的了 (容斥原理、DP)

    题目链接 (Luogu) https://www.luogu.org/problem/P4859 (bzoj) https://www.lydsy.com/JudgeOnline/problem.ph ...

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

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

  6. luogu P4859 已经没有什么好害怕的了

    嘟嘟嘟 题中给的\(k\)有点别扭,我们转换成\(a > b\)的对数是多少,这个用二元一次方程解出来是\(\frac{n + k}{2}\). 然后考虑dp,令\(dp[i][j]\)表示前\ ...

  7. 洛谷P4859 已经没有什么好害怕的了

    因为不存在任意两个数相同,那么设糖果比药片大的组有 \(x\) 个,药片比糖果大的组有 \(y\) 个,那么我们有: \[x + y = n, x - y = k \] 即: \[x = \frac{ ...

  8. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  9. 各种反演细节梳理&模板

    炫酷反演魔术课件byVFK stO FDF Orz(证明全有%%%) 莫比乌斯反演 \(F(n)=\sum\limits_{d|n}f(d)\Rightarrow f(n)=\sum\limits_{ ...

随机推荐

  1. 再议GCC编译时的静态库依赖次顺问题

    假设有如三个源代码文件: $ cat a.cpp void a() { } $ cat b.cpp extern void a(); void b() { a(); // 调用a.cpp中的a() } ...

  2. kinect相机做扫描仪扫描人体模型

  3. 一个GIS系统需具备的功能

    数据的存储(数据结构) 图形显示 功能:拓扑分析 开源的GIS系统:QGIS,SharpMap 各个功能组件

  4. (深搜)棋盘问题 -- poj -- 1321

    链接: http://poj.org/problem?id=1321 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2889 ...

  5. HTML5 Canvas之猜数字游戏

    主要的内容描述的是如何渲染一个矩形的边框和填充背景,以及文字. 代码中有详细的注释: 效果图: 以下是代码: <!DOCTYPE html> <html lang="cn& ...

  6. Spring 框架简介

    Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. 在这篇由三部 ...

  7. yndbtree控件

    yndbtree控件 // cxg 2017-4-25 unit yndbtree; interface uses SysUtils, Classes, ComCtrls, DB, Variants ...

  8. BFC开启条件

    当元素CSS属性设置了下列之一时,即可创建一个BFC: float:left|right position:absolute|fixed display: table-cell|table-capti ...

  9. C# Aes CryptoStream Specified padding mode is not valid for this algorithm的解決方法

    //解密數據            using (var ss = File.OpenRead(@"d:\qq.d.flac"))            {             ...

  10. 关于Unity中MonoBehaviour的构造函数

    关于Unity中MonoBehaviour的构造函数 在学习Unity MVVM UI框架的时候,一不小给一个继承自MonoBehaviour类的子类编写了自定义构造函数,结果调Bug调了两个钟,特此 ...