传送门

见计数想容斥

首先题目可以简单转化一下, 求 糖果比药片能量大的组数比药片比糖果能量大的组数多 $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. 如何让多个android listview同时使用一个滚动条

    如何让多个android listview同时使用一个滚动条 重新设置ListView的高度 /** * 设置listview高度,注意listview子项必须为LinearLayout才能调用该方法 ...

  2. 07Mendel's First Law

    Problem Figure 2. The probability of any outcome (leaf) in a probability tree diagram is given by th ...

  3. docker-compose up启动又停止,需要加tty为true

    如果docker-compose.yml如下,则用docker-compose up -d启动起来的容器可能会立即停止. version: '2' services: mir-http-repo: i ...

  4. Java学习总结——常见问题及解决方法

    CYTX项目开发中遇到的问题及解决方法 Android开发各类常见错误解决方案: 使用Android Studio遇到的问题及解决过程 登录注册部分问题及解决: 1.问题:"No targe ...

  5. CodeForces - 589D —(思维题)

    Welcoming autumn evening is the best for walking along the boulevard and npeople decided to do so. T ...

  6. 开源WebGIS实施方案(三):Shapefile数据导入到PostGIS

    PostGIS新版中提供了一个可视化的工具,用于Shapefile数据的导入和导出,极大的方便了使用者的操作. 创建空间数据库 以具有创建用户权限的账号登录pgAdminIII,连接到数据库 创建一个 ...

  7. 更改SQL Server中默认备份文件夹

    当你安装SQL Server时,安装路径一般如下:C:\Program Files\Microsoft SQL Server\MSSQL.2\MSSQL.在这个目录下也有数据文件的文件夹和备份文件的文 ...

  8. c# 调用微信小程序

    //微信也不给个c#调用的例子 只好自己造咯:ps:大佬勿喷 1 public string GetWx(string code, string iv, string encryptedData) { ...

  9. JAVA—IO操作

    一.JAVA I/O 输入输出流 1:编码问题 2:File类的使用 3:RandomAccessFile的使用 4:字节流的使用 5:字符流的使用 6:对象的序列化和反序列化 2: file类的使用 ...

  10. char、varchar、nchar、nvarchar、text的区别

    char.varchar.nchar.nvarchar.text的区别 1.有var前缀的,表示是实际存储空间是变长的,varchar,nvarchar 所谓定长就是长度固定的,当输入的数据长度没有达 ...