题目传送门

https://lydsy.com/JudgeOnline/problem.php?id=3622

题解

首先显然如果 \(n - k\) 为奇数那么就是无解。否则的话,“糖果”比“药片”大的组数,应该为 \(\frac {n+k}2\)。

考虑到多恰好 \(k\) 组不太好求,但是如果选了 \(k\) 组必须是“糖果”比“药片”大,这个方案数还是很好求的。

首先是选了 \(k\) 组必须是“糖果”比“药片”大的方案数,这可以用一个 dp 解决。我们将糖果排序,然后预处理 \(s_i\) 表示有 \(s_i\) 个药片比糖果小。设 \(dp[i][j]\) 表示前 \(i\) 个糖果选了 \(j\) 个糖果比药片大的组合。转移的时候枚举当前这一个选不选就可以了。

\[dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1] \cdot(s_i - j + 1)
\]

然后我们令 \(f(k)\) 表示钦定了 \(i\) 对“糖果”比“药片”大以后的方案数。那么显然有

\[f(k)=dp[n][k]\cdot(n-k)!
\]

同时可以发现,如果令 \(g(k)\) 为恰好 \(i\) 对“糖果”比“药片”大的方案数,那么有

\[f(k)=\sum_{i=k}^n \binom ik g(i)
\]

所以直接二项式反演就可以了。


代码如下,时间复杂度 \(O(n^2)\)。

  1. #include<bits/stdc++.h>
  2. #define fec(i, x, y) (int i = head[x], y = g[i].to; i; i = g[i].ne, y = g[i].to)
  3. #define dbg(...) fprintf(stderr, __VA_ARGS__)
  4. #define File(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
  5. #define fi first
  6. #define se second
  7. #define pb push_back
  8. template<typename A, typename B> inline char smax(A &a, const B &b) {return a < b ? a = b , 1 : 0;}
  9. template<typename A, typename B> inline char smin(A &a, const B &b) {return b < a ? a = b , 1 : 0;}
  10. typedef long long ll; typedef unsigned long long ull; typedef std::pair<int, int> pii;
  11. template<typename I>
  12. inline void read(I &x) {
  13. int f = 0, c;
  14. while (!isdigit(c = getchar())) c == '-' ? f = 1 : 0;
  15. x = c & 15;
  16. while (isdigit(c = getchar())) x = (x << 1) + (x << 3) + (c & 15);
  17. f ? x = -x : 0;
  18. }
  19. const int N = 2000 + 7;
  20. const int P = 1e9 + 9;
  21. int n, k;
  22. int a[N], b[N], s[N], dp[N][N], f[N];
  23. inline int smod(int x) { return x >= P ? x - P : x; }
  24. inline void sadd(int &x, const int &y) { x += y; x >= P ? x -= P : x; }
  25. inline int fpow(int x, int y) {
  26. int ans = 1;
  27. for (; y; y >>= 1, x = (ll)x * x % P) if (y & 1) ans = (ll)ans * x % P;
  28. return ans;
  29. }
  30. int fac[N], inv[N], ifac[N];
  31. inline void ycl(const int &n = ::n) {
  32. fac[0] = 1; for (int i = 1; i <= n; ++i) fac[i] = (ll)fac[i - 1] * i % P;
  33. inv[1] = 1; for (int i = 2; i <= n; ++i) inv[i] = (ll)(P - P / i) * inv[P % i] % P;
  34. ifac[0] = 1; for (int i = 1; i <= n; ++i) ifac[i] = (ll)ifac[i - 1] * inv[i] % P;
  35. }
  36. inline int C(int x, int y) {
  37. if (x < y) return 0;
  38. return (ll)fac[x] * ifac[y] % P * ifac[x - y] % P;
  39. }
  40. inline void work() {
  41. if ((n - k) & 1) {
  42. puts("-1");
  43. return;
  44. } else k = (n + k) / 2;
  45. std::sort(a + 1, a + n + 1);
  46. for (int i = 1; i <= n; ++i)
  47. for (int j = 1; j <= n; ++j) if (b[j] < a[i]) ++s[i];
  48. dp[0][0] = 1;
  49. for (int i = 1; i <= n; ++i)
  50. for (int j = 0; j <= i; ++j) {
  51. dp[i][j] = dp[i - 1][j];
  52. if (j) sadd(dp[i][j], (ll)dp[i - 1][j - 1] * (s[i] - j + 1) % P);
  53. }
  54. ycl();
  55. for (int i = 0; i <= n; ++i) f[i] = (ll)dp[n][i] * fac[n - i] % P;
  56. int ans = 0;
  57. for (int i = k; i <= n; ++i)
  58. if ((i - k) & 1) sadd(ans, P - (ll)C(i, k) * f[i] % P);
  59. else sadd(ans, (ll)C(i, k) * f[i] % P);
  60. printf("%d\n", ans);
  61. }
  62. inline void init() {
  63. read(n), read(k);
  64. for (int i = 1; i <= n; ++i) read(a[i]);
  65. for (int i = 1; i <= n; ++i) read(b[i]);
  66. }
  67. int main() {
  68. #ifdef hzhkk
  69. freopen("hkk.in", "r", stdin);
  70. #endif
  71. init();
  72. work();
  73. fclose(stdin), fclose(stdout);
  74. return 0;
  75. }

BZOJ3622 已经没有什么好害怕的了 二项式反演+DP的更多相关文章

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

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

  2. [BZOJ3622]已经没有什么好害怕的了(容斥DP)

    给定两个数组a[n]与b[n](数全不相等),两两配对,求“a比b大”的数对比“b比a大”的数对个数多k的配对方案数. 据说做了这题就没什么题好害怕的了,但感觉实际上这是一个套路题,只是很难想到. 首 ...

  3. bzoj 3622 已经没有什么好害怕的了——二项式反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3622 令 f[i] 表示钦定 i 对 a[ ]>b[ ] 的关系的方案数:g[i] 表 ...

  4. BZOJ 3622: 已经没有什么好害怕的了(二项式反演)

    传送门 解题思路 首先将\(a\),\(b\)排序,然后可以算出\(t(i)\),表示\(a(i)\)比多少个\(b(i)\)大,根据容斥套路,设\(f(k)\)表示恰好有\(k\)个\(a(i)\) ...

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

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

  6. [bzoj3622]已经没有什么好害怕的了_动态规划_容斥原理

    bzoj-3622 已经没有什么好害怕的了 题目大意: 数据范围:$1\le n \le 2000$ , $0\le k\le n$. 想法: 首先,不难求出药片比糖果小的组数. 紧接着,我开始的想法 ...

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

    bzoj3622已经没有什么好害怕的了 题意: 给n个数Ai,n个数Bi,将Ai中的数与Bi中的数配对,求配对Ai比Bi大的比Bi比Ai大的恰好有k组的方案数.n,k≤2000 题解: 蒟蒻太弱了只能 ...

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

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

  9. 【BZOJ3622】已经没有什么好害怕的了 容斥+DP

    [BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...

随机推荐

  1. C#:XML操作类

    写的一个XML操作类,包括读取/插入/修改/删除. using System; using System.Data; using System.Configuration; using System. ...

  2. DELPHI 把数据库中的数据转换成XML格式

    function ReplaceString(AString: string): string; begin Result := StringReplace(AString, '&', '&a ...

  3. 20180711-Java Number类

    下面是一个装箱与拆箱的例子: public class Test{ public static void main(String args[]){ Integer x = 5; // boxes in ...

  4. 初步学习JS中的闭包

    JS高级程序设计(3rd)中对闭包的定义就是一句话,首先闭包是一个函数,怎样的函数呢?有权访问另一个函数作用域中的变量 的函数.而创建闭包的常见方式就是在一个函数的内部创建另一个函数,就是嵌套函数. ...

  5. Tomcat服务器时间不正确

    ================================1=============================== 增加Tomcat参数设置"-Duser.timezone=G ...

  6. Spring中两种引入配置文件方式

    用过Spring的人都知道,我们一般把数据库的配置.日志的配置或者其他的通用配置放在单独的配置文件中,在和Spring整合时,一般通过以下两种方法引入: <context:property-pl ...

  7. PHP安装-centos7

    下载地址:https://www.php.net/downloads.php 1.wget下载php源码至/usr/local/src 下 wget https://www.php.net/distr ...

  8. (appium+python)UI自动化_02_appium启动手机app

    前提:需先安装配置好appium+python自动化环境,已配置好环境的小伙伴可以参考以下步骤启动Android app,具体步骤如下: 一.USB连接手机 (1)手机USB连接电脑 (2)手机打开开 ...

  9. BigDecimal保留小数处理

    最近在处理支付相关的需求,涉及到金额的问题,采用传统的基本数据类型处理会存在误差,因此采用BigDecimal对象进行处理. 一.构造BigDecimal对象的方式 BigDecimal(int)   ...

  10. [Codeforces 316E3]Summer Homework(线段树+斐波那契数列)

    [Codeforces 316E3]Summer Homework(线段树+斐波那契数列) 顺便安利一下这个博客,给了我很大启发(https://gaisaiyuno.github.io/) 题面 有 ...