正题

题目链接: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】相关推荐

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

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

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

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

  3. 数论五之容斥——硬币购物,Gerald and Giant Chess,幸运数字,Sky Full of Stars,已经没有什么好害怕的了

    容斥的神 [HAOI2008]硬币购物 problem solution code CF559C Gerald and Giant Chess problem solution code [SCOI2 ...

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

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

  5. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  6. 组合数学与数论函数专题

    组合数学专题 专题简介 本专题包含了一些组合数学中常见的套路和方法,如拉格朗日插值,动态规划,容斥原理,狄利克雷卷积,线性筛,杜教筛 等等. 目录 2018 四川省赛GRISAIA (数论分块) HD ...

  7. 二项式反演(非详细)

    引入 二项式反演又名广义容斥定理 二项式反演可以表示成: f[n]=∑i=0n(−1)iCnigi⟺gn=∑i=0n(−1)iCnif[i]f[n]=\sum_{i=0}^n(-1)^iC_{n}^{ ...

  8. 二项式反演(广义容斥定理)学习笔记

    背景: 二项式反演又名广义容斥定理. 下次再看题解时要注意了. 解锁新姿势. 说白了就是之前会的姿势太少了. 正题: 说白了就是有这样两条恒等的式子: f n = ∑ i = 0 n ( − 1 ) ...

  9. 【算法】有关点分治的一些理解与看法

    说实话在很长一段时间内都对于点分治算法感觉到比较的害怕.主要是感觉它的复杂度非常的高,而且莫名给我留下了一种点分治是有板子的印象.实际上是没有的.而点分治由于将一棵树每次都尽量地划分为了相对平均的几块 ...

最新文章

  1. Flash,一次Bug的思考
  2. Android线程管理(一)
  3. Linux应用程序在内存中的地址布局
  4. 使用抽象类还是接口(Java)
  5. jmeter下TPS插件的安装
  6. Python 进阶——重访 list
  7. 机试指南第七章-动态规划-笔记及背包问题
  8. thinkphp-更新数据update函数
  9. linux下查看文件描述符,linux下文件描述符的查看及分析
  10. 台式计算机 cpu型号大全,台式机CPU参数对照表
  11. 树莓派系统最小img镜像的制作-备份与还原
  12. 视频画中画效果该怎么实现?这款软件让你一秒成大神
  13. 「4+1视图」学习与理解
  14. NRF24L01多发单收配置
  15. 互联网和万维网的区别
  16. vue路由安全守卫 (组件内路由守卫)
  17. HR管理系统的五大选择特点
  18. Scratch编程入门-画图模块6【绘制三角形】
  19. 动态壁纸安卓_抖音上超火的时间轮盘动态壁纸,安卓苹果都可以设置!个性好看...
  20. Matlab中rot90函数用法

热门文章

  1. mysql 5.5.46_MySQL 5.5.46源码安装
  2. python 装饰器实现_Python装饰器系列01 - 如何正确地实现装饰器
  3. oracle+11g+rda,Oracle RDA 4.20 初体验
  4. ubuntu14安装python_ubuntu14.04 安装python3.7
  5. k8s滚动升级_k8s deployment 滚动更新
  6. sql同时向两个表插入数据_SQL入门-数据库和客户端的安装,表的创建和数据插入...
  7. 八大排序算法交换排序算法
  8. 利用结构体数组实现重排序(详解)
  9. leetcode199. 二叉树的右视图(层序遍历03)
  10. leedcode05 找出缺失的观测数据(思路加详解)