P4859 已经没有什么好害怕的了
见计数想容斥
首先题目可以简单转化一下, 求 糖果比药片能量大的组数比药片比糖果能量大的组数多 $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 已经没有什么好害怕的了的更多相关文章
- P4859 已经没有什么好害怕的了(dp+二项式反演)
P4859 已经没有什么好害怕的了 啥是二项式反演(转) 如果你看不太懂二项式反演(比如我) 那么只需要记住:对于某两个$g(i),f(i)$ ---------------------------- ...
- 题解-洛谷P4859 已经没有什么好害怕的了
洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...
- 洛谷 P4859 已经没有什么好害怕的了 解题报告
已经没有什么好害怕的了 题目描述 已经使\(\tt{Modoka}\)有签订契约,和自己一起战斗的想法后,\(\tt{Mami}\)忽然感到自己不再是孤单一人了呢. 于是,之前的谨慎的战斗作风也消失了 ...
- BZOJ 3622 Luogu P4859 已经没有什么好害怕的了 (容斥原理、DP)
题目链接 (Luogu) https://www.luogu.org/problem/P4859 (bzoj) https://www.lydsy.com/JudgeOnline/problem.ph ...
- 洛谷P4859 已经没有什么好害怕的了 [DP,容斥]
传送门 思路 大佬都说这是套路题--嘤嘤嘤我又被吊打了\(Q\omega Q\) 显然,这题是要\(DP\)的. 首先思考一下性质: 为了方便,下面令\(k=\frac{n+k}{2}\),即有恰好\ ...
- luogu P4859 已经没有什么好害怕的了
嘟嘟嘟 题中给的\(k\)有点别扭,我们转换成\(a > b\)的对数是多少,这个用二元一次方程解出来是\(\frac{n + k}{2}\). 然后考虑dp,令\(dp[i][j]\)表示前\ ...
- 洛谷P4859 已经没有什么好害怕的了
因为不存在任意两个数相同,那么设糖果比药片大的组有 \(x\) 个,药片比糖果大的组有 \(y\) 个,那么我们有: \[x + y = n, x - y = k \] 即: \[x = \frac{ ...
- ZJOI2019一轮停课刷题记录
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...
- 各种反演细节梳理&模板
炫酷反演魔术课件byVFK stO FDF Orz(证明全有%%%) 莫比乌斯反演 \(F(n)=\sum\limits_{d|n}f(d)\Rightarrow f(n)=\sum\limits_{ ...
随机推荐
- DataStage 七、在DS中使用配置文件分配资源
DataStage序列文章 DataStage 一.安装 DataStage 二.InfoSphere Information Server进程的启动和停止 DataStage 三.配置ODBC Da ...
- 04 Python入门学习-流程控制(if else elif while for)
一:流程控制if 语法一: if 条件: code1 code2 code3 ... age = 20 height = 170 weight = 60 sex = 'female' is_beaut ...
- 基于etcd插件的CoreDNS动态域名添加
前提条件:已经有一个可用的etcd环境. 一.CoreDNS简介 CoreDNS是一个DNS服务器,和Caddy Server具有相同的模型:它链接插件.CoreDNS是云本土计算基金会启动阶段项目. ...
- UVa 10118 Free Candies (记忆化搜索+哈希)
题意:有4堆糖果,每堆有n(最多40)个,有一个篮子,最多装5个糖果,我们每次只能从某一堆糖果里拿出一个糖果,如果篮子里有两个相同的糖果, 那么就可以把这两个(一对)糖果放进自己的口袋里,问最多能拿走 ...
- linux下mysql安装和调优
1.yum yum -y install mysql-server mysql 2.RPM安装 http://dev.mysql.com/downloads/ 下载RPM包,请确认服务器版本,我的是红 ...
- 安装及运行 RabbitMQ 服务器 (windows)
1. 一些网址 http://www.rabbitmq.com/ http://www.rabbitmq.com/install-windows.html http://www.rabbitmq.co ...
- MySQL性能调优与架构设计——第11章 常用存储引擎优化
第11章 常用存储引擎优化 前言: MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.每一种存储引擎都有各自的特长,也都存在一定的短处. ...
- C# FTPClientHelper共公类 实现文件上传,目录操作,下载等动作
文档说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 1.基本介绍 由于最近的项目是客户端的程序,需要将客户端的图片文件[切图]-[打包]-[ftp上传],现在就差最后一步了 ...
- 通过HttpClient请求webService
通过HttpClient请求webService 由于服务端是用webService开发的,android要调用webService服务获取数据,这里采用的是通过HttpClient发送post请求, ...
- .Net工程师面试笔试宝典
.Net工程师面试笔试宝典 传智播客.Net培训班内部资料 http://net.itcast.cn 这套面试笔试宝典是传智播客在多年的教学和学生就业指导过程中积累下来的宝贵资料,大部分来自于学员从面 ...