传送门

见计数想容斥

首先题目可以简单转化一下, 求 糖果比药片能量大的组数比药片比糖果能量大的组数多 $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. yum 系列(一) yum 和 rpm 常用命令

    yum 系列(一) yum 和 rpm 常用命令 一.yum 常用命令 yum 命令:http://man.linuxde.net/yum yum 是在 Fedora 和 RedHat 以及 SUSE ...

  2. linq join一些忘记的操作

  3. 13 Calculating Expected Offspring

    Problem For a random variable XX taking integer values between 1 and nn, the expected value of XX is ...

  4. 10 Consensus and Profile

    Problem A matrix is a rectangular table of values divided into rows and columns. An m×nm×n matrix ha ...

  5. BI实施的四个层次

    满足业务需求 注重数据分析汇总 统一.高效的系统集成越来越麻烦.管理人员穿梭在具有不同风格.使用逻辑的系统间,越来越厌倦,众多系统之间的业务逻辑.数据含义不一致,使用户无法判 断数据的准确性.任何一个 ...

  6. word复制粘贴表格不齐

    1.查找橡皮擦 2.有时候复制粘贴 表格 会将以前的东西格式也粘贴进来,需要清除格式和重新排版 3.word2007清除格式

  7. windows下C++操作MySQL数据库

    .安装MySQL 2.建立C++控制台程序,新建CPP源文件,如:sqlconn.cpp 3.工程项目中属性—C/C++--常规—附加包含目录中添加mysql安装目录中的MySQL\MySQL\MyS ...

  8. javaWeb项目中到底什么是单例,多例

    你用杯子喝可乐,喝完了不刷,继续去倒果汁喝,就是单例.你用杯子喝可乐,直接扔了杯子,换个杯子去倒果汁喝,就是多例. 数据库连接池就是单例模式,有且仅有一个连接池管理者,管理多个连接池对象. 1. 什么 ...

  9. 《全民无双》锁链刀光程序生成算法,即U3D——刀光轨迹插件的改进

    <全民无双>手游12月17日上线登录APPSTore付费榜前十,首先特别恭喜还在<全民无双>坚持奋战的老同事们,顺便技术分享一下以前参与项目时的工作 锁链刀软武器刀光轨迹 之前 ...

  10. Reverting back to the R12.1.1 and R12.1.3 Homepage Layout

    Reverting back to the 12.1.1 Homepage Layout Set the following profiles: FND: Applications Navigator ...