嘟嘟嘟




题中给的\(k\)有点别扭,我们转换成\(a > b\)的对数是多少,这个用二元一次方程解出来是\(\frac{n + k}{2}\)。




然后考虑dp,令\(dp[i][j]\)表示前\(i\)个数中,有\(j\)对满足\(a > b\)的方案数,转移的时候考虑这一组是否满足\(a > b\)即可:\(dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1] * (num[i] - (j - 1))\)。其中\(num[i]\)表示比\(a[i]\)小的\(b[i]\)的个数。




求完这个还没有完事,因为我们只保证了有\(j\)个满足\(a > b\),而剩下的位置并不清楚。

于是令\(g[i] = dp[n][i] * (n - i)!\),表示\(n\)组匹配中,至少有\(i\)组满足\(a > b\)的方案数,因为剩下的\(n - i\)个位置是瞎排的,所以不知道是否会出现\(a > b\)。




令\(f[i]\)表示恰好有\(i\)个匹配满足\(a > b\),那么能列出\(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]\)。


  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstring>
  6. #include<cstdlib>
  7. #include<cctype>
  8. #include<vector>
  9. #include<stack>
  10. #include<queue>
  11. #include<assert.h>
  12. using namespace std;
  13. #define enter puts("")
  14. #define space putchar(' ')
  15. #define Mem(a, x) memset(a, x, sizeof(a))
  16. #define In inline
  17. typedef long long ll;
  18. typedef double db;
  19. const int INF = 0x3f3f3f3f;
  20. const db eps = 1e-8;
  21. const int maxn = 2e3 + 5;
  22. const ll mod = 1e9 + 9;
  23. In ll read()
  24. {
  25. ll ans = 0;
  26. char ch = getchar(), last = ' ';
  27. while(!isdigit(ch)) last = ch, ch = getchar();
  28. while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
  29. if(last == '-') ans = -ans;
  30. return ans;
  31. }
  32. In void write(ll x)
  33. {
  34. if(x < 0) x = -x, putchar('-');
  35. if(x >= 10) write(x / 10);
  36. putchar(x % 10 + '0');
  37. }
  38. In void MYFILE()
  39. {
  40. #ifndef mrclr
  41. freopen("ha.in", "r", stdin);
  42. freopen("ha.out", "w", stdout);
  43. #endif
  44. }
  45. int n, K, a[maxn], b[maxn], num[maxn];
  46. In ll inc(ll a, ll b) {return a + b < mod ? a + b : a + b - mod;}
  47. ll fac[maxn], C[maxn][maxn];
  48. In void init()
  49. {
  50. fac[0] = 1;
  51. for(int i = 1; i <= n; ++i) fac[i] = fac[i - 1] * i % mod;
  52. C[0][0] = 1;
  53. for(int i = 1; i <= n; ++i)
  54. {
  55. C[i][0] = 1;
  56. for(int j = 1; j <= i; ++j) C[i][j] = inc(C[i - 1][j - 1], C[i - 1][j]);
  57. }
  58. }
  59. ll dp[maxn][maxn];
  60. int main()
  61. {
  62. MYFILE();
  63. n = read(), K = (n + read()) >> 1;
  64. init();
  65. for(int i = 1; i <= n; ++i) a[i] = read();
  66. for(int i = 1; i <= n; ++i) b[i] = read();
  67. sort(a + 1, a + n + 1), sort(b + 1, b + n + 1);
  68. for(int i = 1; i <= n; ++i) num[i] = lower_bound(b + 1, b + n + 1, a[i]) - b - 1;
  69. dp[0][0] = 1;
  70. for(int i = 1; i <= n; ++i)
  71. {
  72. dp[i][0] = dp[i - 1][0];
  73. for(int j = 1; j <= i; ++j)
  74. dp[i][j] = inc(dp[i - 1][j] % mod, dp[i - 1][j - 1] * (num[i] - j + 1) % mod);
  75. }
  76. ll ans = 0;
  77. for(int i = K; i <= n; ++i)
  78. {
  79. int flg = (i - K) & 1;
  80. ll tp = C[i][K] * fac[n - i] % mod * dp[n][i] % mod;
  81. ans = inc(ans, flg ? mod - tp : tp);
  82. }
  83. write(ans), enter;
  84. return 0;
  85. }

luogu P4859 已经没有什么好害怕的了的更多相关文章

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

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

  2. P4859 已经没有什么好害怕的了(dp+二项式反演)

    P4859 已经没有什么好害怕的了 啥是二项式反演(转) 如果你看不太懂二项式反演(比如我) 那么只需要记住:对于某两个$g(i),f(i)$ ---------------------------- ...

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

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

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

    以前开过一遍这题,以为很难没刚下去 今天$ review$一遍分析了一下感觉也还好 luogu 4859 题意:给定长度为$ n \leq 2000$的数组$ A,B$求完全匹配使得$A>B$的 ...

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

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

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

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

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

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

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

    因为不存在任意两个数相同,那么设糖果比药片大的组有 \(x\) 个,药片比糖果大的组有 \(y\) 个,那么我们有: \[x + y = n, x - y = k \] 即: \[x = \frac{ ...

  9. ZJOI2019一轮停课刷题记录

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

随机推荐

  1. SAS学习笔记13 SAS数据清洗和加工(续)

    查找缺失值 cha[*]和num[*]是建立数组cha和num,但不指定数组中的元素数 自动变量_character_表示数据集中的所有字符型变量 自动变量_numeric_表示数据集中的所有数值型变 ...

  2. Abandoning Roads CodeForces - 1149D (最小生成树)

    大意: 给定无向图, 边权只有两种, 对于每个点$x$, 输出所有最小生成树中, 点$1$到$x$的最短距离. 先将边权为$a$的边合并, 考虑添加边权为$b$的边. 每条路径只能经过每个连通块一次, ...

  3. 调整统计信息JOB采样时间

    一.需求说明 Oracle数据库中存在定时JOB,自动执行收集统计信息的程序.但是对于7*24小时系统来说,Oracle配置的定时收集时间不太合理,需要人为调整.本篇博客就是基于这种需求,调整JOB采 ...

  4. 怎样确保页面中的js代码一定是在DOM结构生成之后再调用

    有这样一类问题, 如下所示, 就是在dom结构没有生成时就在js代码中调用了, 此时就会报错: <head> <script> console.log(document.bod ...

  5. hdu 4324

    思路待整理 #include<cstdio> #include<iostream> #include<vector> #include<queue> # ...

  6. docker网络相关

    1.网卡有namespace的概念,不同的俩个namesp之间的网卡不能直接通信 为了俩个namespace的网卡相互通信,可以通过veth pair(一对)来实现.不同容器之间,便是通过veth p ...

  7. 查找-------(HashCode)哈希表的原理

    这段时间 在 准备软件设计师考试    目的是想复习一下  自己以前没怎么学的知识    在这个过程中  有了很大的收获  对以前不太懂得东西  在复习的过程中  有了很大程度的提高 比如在复习 程序 ...

  8. DRF 01

    目录 DRF 接口 概念 YApi接口文档 Postman接口测试 RESTful接口规范 URL设计 响应结果 响应状态码 数据状态码 数据状态信息 数据本身 五大请求方式 简单实现 DRF drf ...

  9. default(Nullable(type)) vs default(type)

    default(Nullable<long>) == null default(long?) == null default(long) == 0L

  10. 简单注册表单--HTML练手项目3【Table】

    [本文为原创,转载请注明出处] 技术[HTML]   布局[Table] 步骤1  划分table布局 步骤2 填充内容 文本框+密码框+单选框+复选框+多行文本域+按钮 <input> ...