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


啥是二项式反演(转)

如果你看不太懂二项式反演(比如我)

那么只需要记住:对于某两个$g(i),f(i)$

----------------------------

如果:$f(n)=\sum_{i=0}^{n}C(n,i)g(i)$

那么:$g(n)=\sum_{i=0}^{n}(-1)^{n-i}\ C(n,i)f(i)$

----------------------------

如果:$f(k)=\sum_{i=k}^{n}C(i,k)g(i)$

那么:$g(k)=\sum_{i=k}^{n}(-1)^{i-k}\ C(i,k)f(i)$


糖果比药片能量大的组数比“药片”比“糖果”能量大的组数多k组。看起来很麻烦

设“药片”比“糖果”能量大的组数为$x$

$x+(x-k)=n$

解得$x=(n+k)/2$,所以$n+k$为奇数一定是没有方案的

现在问题转化成:“药片”比“糖果”能量大的组数为$(n+k)/2$的方案数

看看数据$O(n^2)$可过,想着搞个dp

先将$A[i],B[i]$小到大排好序

蓝后设$f[i][j]$表示(从小到大)扫到$A[i]$(第$i$个),并配好$j$对的方案数

再预处理好$l[i]$表示$B$数组中有多少个数小于$A[i]$

分为不配对或配对的情况,列出方程

$f[i][j]=f[i-1][j]+max(0,l[i]-j+1)*f[i-1][j-1]$

$dp$完了,现在我们来考虑$f[n][i](0<=i<=n)$有啥用(大雾)

对于每个$f[n][i]$,剩下没配对的$n-i$个可以随便排序(注意随便排序可能又配出合法对,有重复计算

于是我们设个$g(i)$表示$n$个数合法配对数$>=i$的排列方案数

$g(i)=f[n][i]*(n-i)!$

但是我们要求的是合法配对数$==i$的排列方案数鸭

设个$f(i)$表示所求↑↑↑

显然对于每个$g(k)\ and\ f(i)\ \ (i>=k)$

$g(k)$都加了$C(i,i-k)=C(i,k)$个$f(i)$进去

于是我们就得到了$g(k)$关于$f(i)$的表达式

$g(k)=\sum_{i=k}^{n}C(i,k)f(i)$

仔细一看,这不是可以套二项式反演吗!

$f(k)=\sum_{i=k}^{n}(-1)^{i-k}\ C(i,k)g(i)$

蓝后就可以愉快地把$f(k)$算出来辣

注意$mod=1e9+9$(不是$1e9+7$)TAT

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
#define N 2010
const ll P=1e9+;
int n,k,A[N],B[N],l[N];
ll f[N][N],g[N],inv[N],fac[N],ifac[N],ans;
void prep(){
inv[]=; fac[]=fac[]=ifac[]=ifac[]=;
for(ll i=;i<=n;++i){
inv[i]=(P-P/i)*inv[P%i]%P;
fac[i]=fac[i-]*i%P;
ifac[i]=ifac[i-]*inv[i]%P;
}
}
inline ll C(int a,int b){return fac[a]*ifac[b]%P*ifac[a-b]%P;}
int main(){
scanf("%d%d",&n,&k);
if((n+k)&){puts(""); return ;}
k=(n+k)/; prep();
for(int i=;i<=n;++i) scanf("%d",&A[i]);
for(int i=;i<=n;++i) scanf("%d",&B[i]);
sort(A+,A+n+); sort(B+,B+n+); int tmp=;
for(int i=;i<=n;++i){
while(tmp<n&&B[tmp+]<A[i]) ++tmp;
l[i]=tmp;
}f[][]=;
for(int i=;i<=n;++i){
f[i][]=f[i-][];
for(int j=;j<=i;++j)
f[i][j]=(f[i-][j]+1ll*(l[i]-j+)*f[i-][j-])%P;
}
for(int i=;i<=n;++i) g[i]=f[n][i]*fac[n-i]%P;
for(int i=k;i<=n;++i)
ans=((ans+1ll*(((i-k)&)?-:)*C(i,k)*g[i])%P+P)%P;
printf("%lld",ans);
return ;
}

P4859 已经没有什么好害怕的了(dp+二项式反演)的更多相关文章

  1. BZOJ3622 已经没有什么好害怕的了 【dp + 二项式反演】

    题目链接 BZOJ3622 题解 既已开题 那就已经没有什么好害怕的了 由题目中奇怪的条件我们可以特判掉\(n - k\)为奇数时答案为\(0\) 否则我们要求的就是糖果大于药片恰好有\(\frac{ ...

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

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

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

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

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

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

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

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

  6. BZOJ 3622 : 已经没有什么好害怕的了(dp + 广义容斥原理)

    今天没听懂 h10 的讲课 但已经没有什么好害怕的了 题意 给你两个序列 \(a,b\) 每个序列共 \(n\) 个数 , 数之间两两不同 问 \(a\) 与 \(b\) 之间有多少配对方案 使得 \ ...

  7. luoguP4859 已经没有什么好害怕的了(二项式反演)

    luoguP4859 已经没有什么好害怕的了(二项式反演) 祭奠天国的bzoj. luogu 题解时间 先特判 $ n - k $ 为奇数无解. 为了方便下记 $ m = ( n + k ) / 2 ...

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

    传送门 见计数想容斥 首先题目可以简单转化一下, 求 糖果比药片能量大的组数比药片比糖果能量大的组数多 $k$ 组 的方案数 因为所有能量各不相同,所以就相当于求 糖果比药片能量大的组数为 $(n+k ...

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

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

随机推荐

  1. vs代码模板制作

    VS2008代码模板制作 一,类模板制作: 路径:C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\ItemTemplate ...

  2. 微信小程序--地图组件与api-模拟器上返回的scale 与真机上不同--bindregionchange触发图标一直闪现问题

    场景:根据地理定位获取不同地区的充电桩位置,要求 1.平移的时候,跟随坐标变化展示不同区域的坐标点信息 2.不同的缩放等级,14以下,展示聚合点数据,14以上,展示真正的站点信息: 3.点击聚合点的时 ...

  3. js初级练习

    知识点:1.for循环的运用:2.this的使用.索引值:3自定义属性 说明:获取到的元素下文用element代替 学习涉及到的知识: 清除元素类名: element.className=" ...

  4. 当使用eclipse将项目部署到Tomcat时,提示Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modul

    原因: 此版本选择过高.当出现此错误时,直接对项目可能无法进行修改.可以通过修改项目的配置文件来达到目的. \workspace\项目名称\.settings\org.eclipse.wst.comm ...

  5. Redis 开发规范

    本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明. 键值设计 命令使用 客户端使用 相关工具 通过本文的介绍可以减少使用Redis过程带来的问题. 一.键值设计 1.key名设计 ...

  6. Python 进阶 异步async/await

    一,前言 本文将会讲述Python 3.5之后出现的async/await的使用方法,我从上看到一篇不错的博客,自己对其进行了梳理.该文章原地址https://www.cnblogs.com/dhcn ...

  7. 真正可用的安卓webview html图片上传限制突破处理(拍照+相册都可以用)

    两篇起步使用webview参考文章,第一篇解除限制,但会调用外部浏览器打开链接,第二篇 覆盖shouldOverrideUrlLoading return true https://www.jb51. ...

  8. MATLAB绘制函数图

    序言 Matlab可以根据用户给出的数据绘制相应的函数图.对于单个2D函数图,需要给出一个行向量x作为函数图上离散点集的横坐标,以及一个与x列数一样的横坐标y作为函数图上点集的纵坐标. 向量x和y的取 ...

  9. opatchauto failed with error code 42 补丁目录权限问题

    [root@WWJD1 ~]# opatchauto apply $UNZIPPED_PATCH_LOCATION/28183653 OPatchauto session is initiated a ...

  10. 微软移除WIN10密码过期政策Microsoft Removes Password-Expiration Policy in Windows 10

    Microsoft this week announced a series of changes to the security baseline in Windows 10, including ...