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_{ ...
随机推荐
- [OS] 远程启动计划任务时以管理员身份运行
在Jenkins建了一个task自动启动Selenium的Grid,命令行是这样写的: schtasks /end /tn RestartGrid /s SZTEST201606 /u szdomai ...
- etl业务说明图
- 关于使用 ps脚本来处理图片的排层问题
问题是这样,在三维软件 把模型切割,给切割的部件排上序号 如 :tianji_1-431_bujian13.png 中间一段数据就是表示的 1.431 该数据之后 会到ps总排层使用 在ps排层出三维 ...
- CodeForces 688B Lovely Palindromes (水题回文)
题意:给一个数n,让你找出长度为偶数,并且是第 n 个回文数. 析:你多写几个就知道了,其实就是 n,然后再加上n的逆序,不过n有点大,直接用string 好了. 代码如下: #include < ...
- redis windows下安装
1.下载redis windows文件包 下载地址 2.解压文件包 复制压缩包地址 3.进入cmd 命令行 cd进入redis文件包目录 4.执行 redis-server.exe 使用netsta ...
- mfc的一点总结-----Edit Control操作
获取Edit Control(编辑框)的内容: CString key; GetDlgItem(IDC_EDIT1)->GetWindowText(key); 其中IDC_EDIT1是所要获取编 ...
- EventBus事件总线框架(发布者/订阅者模式,观察者模式)
一. android应用内消息传递的方式: 1. handler方式-----------------不同线程间传递消息. 2. Interface接口回调方式-------任意两个对象. 3. In ...
- SQL Server关于存储过程的一点简单使用心得
===========================创建无参无返回值的存储过程===========================create proc pro_nameas--要执行的sql语句 ...
- Selenium WebDriver之JavaScript
WebDriver提供了方法来同步/异步执行JavaScript代码,这是因为JavaScript可以完成一些WebDriver本身所不能完成的功能,从而让WebDriver更加灵活和强大. 本文中所 ...
- 用VC实现特定编辑框上对回车键响应
一.引言 在通常的以CEditView为基类的单文档/多文档视图程序中,可以很好的响应键盘输入的回车键,只需比较最近两次的输入的字符,看看最新输入的字符是否内码是13(0x0d,回车键的内码)即可识别 ...