思路

  • “恰k个”考虑求至少k、k+1……个容斥
  • 题面说所有数字都不同,可以将所求转化为糖比药多的组数恰为\((n+k)/2\)的方案数
  • \(f[i][j]\)数组我觉得更好的理解方式是"前i个已经安排了j组糖大于药、别的先没管"的方案数
  • \(f[n][i]*(n-i)!\)即为把其它的安排了以后的方案数,但是这里面有重的
  • 设\(g[i]\)为恰i个的方案数。$$g[i]=f[n][i]*(n-i)!-\sum_{j=i+1}ng[j]*C_ji$$要说为什么又去重又剪掉不合法了,我也不通透,目前只是已知这样做是对的话那直观感受一下应该对吧……
  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. typedef long long ll;
  5. const int mod = 1e9 + 9;
  6. const int maxn = 2005;
  7. int n, k, m, ans;
  8. int a[maxn], b[maxn];
  9. ll f[maxn][maxn], g[maxn];
  10. ll fac[maxn], C[maxn][maxn];
  11. int READ() {
  12. scanf("%d %d", &n, &k);
  13. for (int i = 1; i <= n; i++)
  14. scanf("%d", &a[i]);
  15. for (int i = 1; i <= n; i++)
  16. scanf("%d", &b[i]);
  17. m = (n + k) / 2;
  18. return (n + k) % 2;
  19. }
  20. void PRE() {
  21. sort(a + 1, a + 1 + n);
  22. sort(b + 1, b + 1 + n);
  23. fac[0] = 1;
  24. for (int i = 1; i <= n; i++)
  25. fac[i] = fac[i - 1] * i % mod;
  26. for (int i = 0; i <= n; i++) {
  27. C[i][0] = 1;
  28. for (int j = 1; j <= i; j++)
  29. C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
  30. }
  31. }
  32. void DP() {
  33. for (int i = 0; i <= n; i++)
  34. f[i][0] = 1;
  35. for (int i = 1, p = 0; i <= n; i++) {
  36. for (; p < n && b[p + 1] < a[i]; p++);
  37. for (int j = 1; j <= i; j++) {
  38. f[i][j] = (f[i - 1][j - 1] * max(0, p - j + 1) % mod + f[i - 1][j]) % mod;
  39. }
  40. }
  41. for (int i = n; i >= m; i--) {
  42. g[i] = f[n][i] * fac[n - i] % mod;
  43. for (int j = i + 1; j <= n; j++) {
  44. g[i] = (g[i] - g[j] * C[j][i] % mod) % mod;
  45. }
  46. }
  47. ans = (g[m] + mod) % mod;
  48. }
  49. int main() {
  50. if (READ() == 1) {
  51. return !printf("0\n");
  52. }
  53. PRE();
  54. DP();
  55. return !printf("%d\n", ans);
  56. }

BZOJ3622(容斥+dp)的更多相关文章

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

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

  2. HDU 5794 A Simple Chess (容斥+DP+Lucas)

    A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...

  3. [CF1086E]Beautiful Matrix(容斥+DP+树状数组)

    给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...

  4. $bzoj2560$ 串珠子 容斥+$dp$

    正解:容斥+$dp$ 解题报告: 传送门$QwQ$ $umm$虽然题目蛮简练的了但还是有点难理解,,,我再抽象一点儿,就说有$n$个点,点$i$和点$j$之间有$a_{i,j}$条无向边可以连,问有多 ...

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

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

  6. 【XSY3156】简单计数II 容斥 DP

    题目大意 定义一个序列的权值为:把所有相邻的相同的数合并为一个集合后,所有集合的大小的乘积. 特别的,第一个数和最后一个数是相邻的. 现在你有 \(n\) 种数,第 \(i\) 种有 \(c_i\) ...

  7. bzoj3782上学路线(Lucas+CRT+容斥DP+组合计数)

    传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3782 有部分分的传送门:https://www.luogu.org/problemnew/ ...

  8. AGC 005D.~K Perm Counting(容斥 DP 二分图)

    题目链接 \(Description\) 给定\(n,k\),求 满足对于所有\(i\),\(|a_i-i|\neq k\)的排列的个数. \(2\leq n\leq 2000,\quad 1\leq ...

  9. ARC 101E.Ribbons on Tree(容斥 DP 树形背包)

    题目链接 \(Description\) 给定一棵\(n\)个点的树.将这\(n\)个点两两配对,并对每一对点的最短路径染色.求有多少种配对方案使得所有边都至少被染色一次. \(n\leq5000\) ...

随机推荐

  1. 使用C++模拟C#的委托机制

    1. [代码][C/C++]代码 //Event.h  #ifndef _EVENT_H_#define _EVENT_H_class EmptyObject {};template<typen ...

  2. POJ 2151 Check the difficulty of problems:概率dp【至少】

    题目链接:http://poj.org/problem?id=2151 题意: 一次ACM比赛,有t支队伍,比赛共m道题. 第i支队伍做出第j道题的概率为p[i][j]. 问你所有队伍都至少做出一道, ...

  3. PHP中调用接口

    引用:http://zhidao.baidu.com/question/454935450.html&__bd_tkn__=67bd5d3a742a8b244e09a86fb8b824aa95 ...

  4. Multiple webcams on ZoneMinder

    Monitoring a 3D Printer I have tidied my new workshop and I am starting to play with 3d-printing aga ...

  5. ACM学习历程—CodeForces 176B Word Cut(字符串匹配 && dp && 递推)

    Description Let's consider one interesting word game. In this game you should transform one word int ...

  6. 红黑树的C语言实现

    rbtree.h #ifndef _RED_BLACK_TREE_H_ #define _RED_BLACK_TREE_H_ #define RED 0 // 红色节点 #define BLACK 1 ...

  7. Restore Points 制定回退方案

    Restore Points 制定回退方案 背景:Flashback Database 和 restore points 都可以提供一个基于时间点的回滚. 理论:1) Normal Restore P ...

  8. MVC 模式介绍(1)

    MVC 模式 MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式.这种模式用于应用程序的分层开发. Model(模型) - 模型代表一个存取数据的对象或 JAVA ...

  9. Advanced R之构造子集

    转发请声明出处:http://www.cnblogs.com/lizichao/p/4794733.html 构造子集 R构造子集的操作功能强大而且速度快.精通构造子集者可以用简洁的方式表达复杂的操作 ...

  10. Eclipse&nbsp;安装插件

    Eclipse 安装插件 本文介绍Eclipse插件的安装方法.Eclipse插件的安装方法大体有三种:直接复制.使用link文件,以及使用eclipse自带的图形界面的插件安装方法. AD: 做为当 ...