zoukankan      html  css  js  c++  java
  • 容斥复习

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

    错位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) 的容斥系数累加起来即可.

  • 相关阅读:
    Matlab 绘制三维立体图(以地质异常体为例)
    Azure DevOps的variable group实现array和hashtable参数的传递
    Azure DevOps 利用rest api设置variable group
    Azure AADSTS7000215 其中一种问题的解决
    Power BI 实现实时更新Streaming Dataset
    AAD Service Principal获取azure user list (Microsoft Graph API)
    Matlab 沿三维任意方向切割CT图的仿真计算
    Azure Powershell script检测登陆并部署ARM Template
    Azure KeyVault设置策略和自动化添加secrets键值对
    Azure登陆的两种常见方式(user 和 service principal登陆)
  • 原文地址:https://www.cnblogs.com/acha/p/9294395.html
Copyright © 2011-2022 走看看