• 容斥复习


    突然就一点容斥都不会了... 重学一下

    错位1

    题目大意: (n) 个人 (n) 个位置, 求恰有 (0) 个人站在自己编号上的方案数

    做法:
    好算的东西是 (f[i] = inom n i (n-i)!)
    (f[i]) 中还包含了一些 (jge i) 的方案.
    我们给每个在 (f[i]) 时被算到的方案附上一个系数 (coef[i])
    注意到每个 (j) 的方案会被 (i) 附上 (inom j i) 次系数.
    而我们希望每个 (j eq 0) 的方案被附上系数和为 (0), 反之为 (1) . 也就是说

    [[j=0] = sum_{ile j} inom j i coef[i] ]

    这里 (coef[i] = (-1)^i)

    错位2

    题目大意: (n) 个人 (n) 个位置, 求恰有 (k) 个人站在自己编号上的方案数

    做法:
    沿用上题的思路

    [[j=k] = sum_{i le j} inom j i coef[i] ]

    使用二项式反演得 (coef[i] = (-1)^{i-k} inom i k)

    求容斥系数的一些方法:

    1. 二项式反演
      (f(n) = sum_{i=0}^n inom n i g(i))
      其中 (g) 为容斥系数, (f) 为我们希望每个位置被统计多少次, 那么
      (g(n) = sum_{i=0}^n inom n i g(i) [n-i=0])
      (g(n) = sum_{i=0}^n inom n i g(i) sum_{j=0}^{n-i} inom {n-i} j (-1)^j)
      (g(n) = sum_{j=0}^n inom n j (-1)^j f(n-j))
      (g(n) = sum_{j=0}^n inom n j (-1)^{n-j} f(j))

    1') 另一个方向的二项式反演
    (f(i) = sum_{j=i}^n inom j i g(j))
    (g(j) = sum_{i=j}^n g(i) [i=j])
    (g(j) = sum_{i=j}^n g(i) sum_{k=j}^i (-1)^{k-j} inom k j inom i k)
    (g(j) = sum_{k=j}^n (-1)^{k-j} inom k j f(k))

    1. 暴力打表
      用逐项确定的方法.
      其实本质是多项式求逆

    2. 附上一个组合数的表.

    0 1 2 3 4 5 6
    1 -6 ? ? ? ? ?
    1 -5 15 ? ? ? ?
    1 -4 10 -20 ? ? ?
    1 -3 6 -10 15 ? ?
    1 -2 3 -4 5 -6 ?
    1 -1 1 -1 1 -1 1
    1 1
    1 2 1
    1 3 3 1
    1 4 6 4 1
    1 5 10 10 5 1
    1 6 15 20 15 6 1

    bzoj 黑暗的幻想乡

    题目大意: (nle 17) 个点, 若干条边, 每条边颜色为 ([1, n-1]). 求每种颜色都恰好出现一次的生成树个数

    做法:
    暴力枚举每个颜色子集, (f[s]) 为只连 (s) 中的颜色的边进行 Matrix-tree计数 的结果
    (s) 会给它的每个子集附上容斥系数
    我们希望 $$[s=mask] = sum_{ssubseteq t} coef[t]$$
    (coef[t] = (-1)^{|mask| - |t|})

    前夕

    题目大意:
    (n le 10^7), 有 (0cdots 2^n-1) 这么些二进制数
    要在里面选若干个, 使得交的大小为 (L(Lle 4)) 的倍数, 求方案数

    做法:
    (f[i] = inom n i 2^{2^{n-i}})
    会包含 (jge i) 的情况, 每个被算 (inom j i)
    跟之前的 错位2 一样, 要求恰好 (k) 时的容斥系数为 (coef[i] = (-1)^{i-k} inom i k)
    这题我们要求 (L|k) 的所有 (k) 的和, 因此容斥系数为 (coef[i] = (-1)^i sum_{L|k} (-1)^{-k} inom i k)
    (mod x^L) 意义下求 ((1-x)^i) 即可, 可以递推

    同色段

    题目大意: (c) 个颜色, (n) 个位置, 求同色段数恰为 (k) 的填色方案数

    做法:
    (f[i] = inom {n-1}{i-1} c^i)
    这会包含 (j le i) 的情况, 每个被算 (inom {n-j}{i-j})
    需要满足等式为 $$[j=k] = sum_{i=j}^n inom {n-j}{i-j} coef[i]$$
    (coef[i] = (-1)^{k-i} inom {n-i}{k-i})

    2017山东一轮集训 苹果树

    具体见 我2017山东一轮集训的博客.
    主要是这题的容斥系数等式跟上题很像, 写出来对比一下

    [[j=k] = sum_{i=0}^{j} inom {n-i}{j-i} coef[i] ]

    (coef[i] = (-1)^{i-k} inom{n-k}{i-k})

    联通块

    题目大意: (n le 12) 个点, 求恰好 (k) 个联通块的图的个数

    做法:
    Bell数枚举划分, 要求划分之间没有连边, 其他乱连.
    对于划分 (i) , 可能导致继续划分, 成为 (j) , 每个 (j) 被算重 (egin{Bmatrix}|j|\|i|end{Bmatrix})

    [[j=k] = sum_{i=0}^j egin{Bmatrix}j\iend{Bmatrix} coef[i] ]

    (coef[i] = (-1)^{i-k} egin{bmatrix} i \ k end{bmatrix})

    同色段2

    题目大意:
    (n) 种数字, 第 (i) 种数字有 (c_i) 个.
    求用完所有数字的所有方案中, 同色段长度的乘积 的和是多少

    做法:
    之前的题都是 "方案数". 带上权值之后有两种方法:

    1. 保证每种方案在不同地方都以正确的权值被统计
    2. 把权值附在容斥系数等式上
      这题用方法2
      (dp) 预处理出 (sp[x][i]) 为将第 (x) 种数字分成 (i) 段时的段长乘积
      考虑记 (i_x)(x) 这种数字分成了多少段.
      ((i_1, cdots i_n)) 为一种可能的分段方法, 多项式系数把所有数字的段插起来
      这样会包含 ((j_1le i_1, cdots, j_nle i_n)) 的划分方案, 记重次数为插板

    [prod_{x=1}^n [j_x=k_x] imes sp[x][j_x] = sum_{i_1 ge j_1, cdots i_n ge j_n} prod_{x=1}^n inom {i_x-1}{j_x-1} coef[i_x] ]

    独立出来就是 ([j=k] imes sp[k] = sum_{i=j}^n inom {i-1}{j-1} coef[i])
    (coef[i] = (-1)^{k-i} inom{k-1}{i-1} sp[k])

    因为这题不是求 "恰好", 我们把对于每个 (k) 的容斥系数累加起来即可.

  • 相关阅读:
    HIVE高级(14):优化(14) Hive On Spark配置
    HIVE高级(13):优化(13) Hive Job 优化
    HIVE高级(12):优化(12) 数据倾斜
    HIVE高级(11):优化(11) HQL 语法优化(2) 多表优化
    HIVE高级(10):优化(10) HQL 语法优化(1) 单表优化
    HIVE高级(9):优化(9) Hive 建表优化(1) 分区表/分桶表/合适的文件格式/合适的压缩格式
    HIVE高级(8):优化(8) Explain 查看执行计划(二)
    Hive基础(19):Hive 函数(2) 自定义函数/自定义 UDF 函数/自定义 UDTF 函数
    Hive基础(18):Hive语法(5) DDL(2) 分区表和分桶表
    MATLAB RGB2HSV、HSV2RGB
  • 原文地址:https://www.cnblogs.com/acha/p/9294395.html
Copyright © 2020-2023  润新知