P4859-已经没有什么好害怕的了【容斥,dp】
正题
题目链接:https://www.luogu.com.cn/problem/P4859
题目大意
两个长度为nnn的序列a,ba,ba,b两两匹配,求ai>bia_i>b_iai>bi的组数比ai<bia_i<b_iai<bi的组数多kkk的方案数。
保证输入数字两两不同
解题思路
其实就是求恰好有n+k2\frac{n+k}{2}2n+k种ai>bia_i>b_iai>bi的匹配方案。
先设fi,jf_{i,j}fi,j表示到aaa的第iii个,已经选择了jjj组的方案。转移起来比较麻烦,我们不知道bbb中选了哪些。
把aaa和bbb排序后,设lil_ili表示一个最大的数字使得ai>blia_i>b_{l_i}ai>bli,然后就可以dpdpdp了
fi,j=fi−1,j+fi−1,j−1×(li−j+1)f_{i,j}=f_{i-1,j}+f_{i-1,j-1}\times(l_i-j+1)fi,j=fi−1,j+fi−1,j−1×(li−j+1)
之后发现我们很难固定其他配对的大小,可以考虑容斥,设gig_igi表示至少有iii对满足ai>bia_i>b_iai>bi的方案,那么有gi=fi×(n−i)!g_i=f_i\times (n-i)!gi=fi×(n−i)!。
然后就可以直接容斥了,因为gig_igi中有(ik)\binom{i}{k}(ki)中方案选出kkk个配对满足,所以容斥系数就是(−1)i−k(ik)(-1)^{i-k}\binom{i}{k}(−1)i−k(ki)
答案就是
∑i=kn(−1)i−k(ik)gi\sum_{i=k}^n(-1)^{i-k}\binom{i}{k}g_ii=k∑n(−1)i−k(ki)gi
时间复杂度O(n2)O(n^2)O(n2)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2100,P=1e9+9;
ll n,k,C[N][N],a[N],b[N],f[N][N],g[N],l[N],ans;
signed main()
{scanf("%lld%lld",&n,&k);if((n+k)&1)return puts("0")&0;k=(n+k)/2;C[0][0]=1;for(ll i=1;i<=n;i++)for(ll j=0;j<=i;j++)C[i][j]=(C[i-1][j]+(j?C[i-1][j-1]:0))%P;for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);for(ll i=1;i<=n;i++)scanf("%lld",&b[i]);sort(a+1,a+1+n);sort(b+1,b+1+n);for(ll i=1;i<=n;i++) for(ll j=1;j<=n;j++)if(b[j]<a[i])l[i]=j;else break;f[0][0]=1;for(ll i=1;i<=n;i++)for(ll j=0;j<=n;j++)f[i][j]=(f[i-1][j]+(j?f[i-1][j-1]*max(l[i]-j+1,0ll)%P:0))%P;for(ll i=n,s=1;i>=0;i--,s=s*(n-i)%P)g[i]=f[n][i]*s%P;for(ll i=k;i<=n;i++){ll tmp=g[i]*C[i][k]%P;(ans+=((i-k)&1)?P-tmp:tmp)%=P;}printf("%lld\n",ans);return 0;
}
P4859-已经没有什么好害怕的了【容斥,dp】相关推荐
- BZOJ 3622 Luogu P4859 已经没有什么好害怕的了 (容斥原理、DP)
题目链接 (Luogu) https://www.luogu.org/problem/P4859 (bzoj) https://www.lydsy.com/JudgeOnline/problem.ph ...
- 洛谷 P4859 已经没有什么好害怕的了 解题报告
已经没有什么好害怕的了 题目描述 已经使\(\tt{Modoka}\)有签订契约,和自己一起战斗的想法后,\(\tt{Mami}\)忽然感到自己不再是孤单一人了呢. 于是,之前的谨慎的战斗作风也消失了 ...
- 数论五之容斥——硬币购物,Gerald and Giant Chess,幸运数字,Sky Full of Stars,已经没有什么好害怕的了
容斥的神 [HAOI2008]硬币购物 problem solution code CF559C Gerald and Giant Chess problem solution code [SCOI2 ...
- P4859 已经没有什么好害怕的了
传送门 见计数想容斥 首先题目可以简单转化一下, 求 糖果比药片能量大的组数比药片比糖果能量大的组数多 $k$ 组 的方案数 因为所有能量各不相同,所以就相当于求 糖果比药片能量大的组数为 $(n+k ...
- ZJOI2019一轮停课刷题记录
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...
- 组合数学与数论函数专题
组合数学专题 专题简介 本专题包含了一些组合数学中常见的套路和方法,如拉格朗日插值,动态规划,容斥原理,狄利克雷卷积,线性筛,杜教筛 等等. 目录 2018 四川省赛GRISAIA (数论分块) HD ...
- 二项式反演(非详细)
引入 二项式反演又名广义容斥定理 二项式反演可以表示成: f[n]=∑i=0n(−1)iCnigi⟺gn=∑i=0n(−1)iCnif[i]f[n]=\sum_{i=0}^n(-1)^iC_{n}^{ ...
- 二项式反演(广义容斥定理)学习笔记
背景: 二项式反演又名广义容斥定理. 下次再看题解时要注意了. 解锁新姿势. 说白了就是之前会的姿势太少了. 正题: 说白了就是有这样两条恒等的式子: f n = ∑ i = 0 n ( − 1 ) ...
- 【算法】有关点分治的一些理解与看法
说实话在很长一段时间内都对于点分治算法感觉到比较的害怕.主要是感觉它的复杂度非常的高,而且莫名给我留下了一种点分治是有板子的印象.实际上是没有的.而点分治由于将一棵树每次都尽量地划分为了相对平均的几块 ...
最新文章
- Flash,一次Bug的思考
- Android线程管理(一)
- Linux应用程序在内存中的地址布局
- 使用抽象类还是接口(Java)
- jmeter下TPS插件的安装
- Python 进阶——重访 list
- 机试指南第七章-动态规划-笔记及背包问题
- thinkphp-更新数据update函数
- linux下查看文件描述符,linux下文件描述符的查看及分析
- 台式计算机 cpu型号大全,台式机CPU参数对照表
- 树莓派系统最小img镜像的制作-备份与还原
- 视频画中画效果该怎么实现?这款软件让你一秒成大神
- 「4+1视图」学习与理解
- NRF24L01多发单收配置
- 互联网和万维网的区别
- vue路由安全守卫 (组件内路由守卫)
- HR管理系统的五大选择特点
- Scratch编程入门-画图模块6【绘制三角形】
- 动态壁纸安卓_抖音上超火的时间轮盘动态壁纸,安卓苹果都可以设置!个性好看...
- Matlab中rot90函数用法
热门文章
- mysql 5.5.46_MySQL 5.5.46源码安装
- python 装饰器实现_Python装饰器系列01 - 如何正确地实现装饰器
- oracle+11g+rda,Oracle RDA 4.20 初体验
- ubuntu14安装python_ubuntu14.04 安装python3.7
- k8s滚动升级_k8s deployment 滚动更新
- sql同时向两个表插入数据_SQL入门-数据库和客户端的安装,表的创建和数据插入...
- 八大排序算法交换排序算法
- 利用结构体数组实现重排序(详解)
- leetcode199. 二叉树的右视图(层序遍历03)
- leedcode05 找出缺失的观测数据(思路加详解)