zoukankan      html  css  js  c++  java
  • 从 简单容斥 到 min-max 容斥 与 二项式反演

    证明基本都是自己瞎证的,如果证法比较丑请见谅。

    容斥原理

    一道小学题(n(nle 10^9)) 以内不能被 (2,3,5) 整除的整数个数。

    VCSXLQ@HL_N79HFO_3V8CSF.png

    考虑这个 Venn 图。三个圆分别表示被 (2,3,5) 整除的数构成的集合,那么要求的就是圆外的面积。

    假设什么限制也不管,只管一共有 (n) 个数,那么每块都是算一遍。

    圆外的面积自然就是总面积减去里面的,我们想到 (n-lfloor frac{n}{2} floor-lfloor frac{n}{3} floor-lfloor frac{n}{5} floor)

    你发现重合的部分多扣了,所以你又把两两的重合部分加上,现在你的答案是 (n-lfloorfrac{n}{2} floor-lfloorfrac{n}{3} floor-lfloorfrac{n}{5} floor+lfloorfrac{n}{2 imes 3} floor+lfloorfrac{n}{2 imes 5} floor+lfloorfrac{n}{3 imes 5} floor)

    你发现中间(三圆重合的部分)又多出来了,把它减掉。(n-lfloorfrac{n}{2} floor-lfloorfrac{n}{3} floor-lfloorfrac{n}{5} floor+lfloorfrac{n}{2 imes 3} floor+lfloorfrac{n}{2 imes 5} floor+lfloorfrac{n}{3 imes 5} floor-lfloorfrac{n}{2 imes 3 imes 5} floor)

    你发现它完美了:该算的被算了一遍,别的被算了零遍。


    考虑一个比较一般的容斥的式子:

    (A_1)(A_n)(n) 个集合,(U={1,2,cdots ,n})。那么

    [|igcup_{i=1}^n A_i|=sum_{Ssubset U,S e emptyset}(-1)^{|S|-1}|igcap_{iin S}A_i| ]

    为什么这是对的?

    考虑一个元素。假设它出现在了 (n) 个集合中的 (k(k>0)) 个。则它的贡献恰好是
    (sum_{i=1}^k (-1)^{i-1}inom ki\ =1-sum_{i=0}^k (-1)^iinom ki\ =1-(-1+1)^k\ =1)
    。我们发现有出现过的算了一次,没出现过的算了零次。

    根据上面的经验,我们发现,容斥就是通过加加减减的方式,使得符合要求的方案算到恰好一遍,其他方案算到零遍,以做到不重不漏不多不少。

    二项式反演

    小学题加强版(k=0,1,2,3),分别求出 (n(nle 10^9)) 以内恰能被 (2,3,5) 中的 (k) 个整除的整数个数。

    先考虑 (k=3),这时候答案显然是三圆重合的部分,就是 (f_3=lfloorfrac{n}{2 imes 3 imes 5} floor)

    然后是 (k=2),这时我们想到 (lfloorfrac{n}{2 imes 3} floor+lfloorfrac{n}{2 imes 5} floor+lfloorfrac{n}{3 imes 5} floor)。但是你发现中间那块被多算了 (3) 遍,于是有 (f_2=lfloorfrac{n}{2 imes 3} floor+lfloorfrac{n}{2 imes 5} floor+lfloorfrac{n}{3 imes 5} floor-inom 32f_3) 了。

    接下来算 (k=1),和刚才一样,你算出了 (f_1=lfloorfrac{n}{2} floor+lfloorfrac{n}{3} floor+lfloorfrac{n}{5} floor-inom 21f_2-inom 31f_3)

    那么 (f_0=n-inom 10f_1-inom 20f_2-inom 30f_3)


    考虑比较一般的问题。你有 (n) 个限制,对所有的 (k),要求出满足恰好 (k) 个限制的方案数。

    对于一个 (k),你强行钦定它满足其中 (k) 个条件,而算出答案为 (g_k);记最后的答案为 (f_k)。那么根据刚才的经验,很明显:

    [f_k= g_k-sum_{j=k+1}^ninom jk f_j ]

    但这个复杂度是 (n^2) 的,有时候 (n) 很大,你算不了。有没有更快的做法?

    那你移个项,容易得到:(g_k=sum_{j=k}^ninom jk f_j)

    组合数拆出来:(k!g_k=sum_{j=k}^n frac{1}{(j-k)!}j!f_j)

    (g'_k=g_{n-k}(n-k)!,f'_k=f_{n-k}(n-k)!)。那么 (g'_k=sum_{j=0}^kfrac{1}{(k-j)!}f'_j)

    然后是喜闻乐见的生成函数环节。(G_1(x)=sum_i g'_ix^i,F_1(x)=sum_i f'_ix^i)

    那么就有 (G_1(x)=e^xF_1(x))。所以 (F_1(x)=e^{-x}G_1(x))。而 (e^{-x}=sum_i (-1)^ifrac{x^i}{i!})

    这时候我们就有了明显的思路:先从 (g) 数组转成 (G_1(x)),然后使用 FFT/NTT 做卷积,算出 (F_1(x)),然后转成 (f) 数组。

    时间复杂度 (O(nlog n))


    但是有时候我们不仅想这样求,还想把式子给他写得漂亮些。

    刚刚我们推到了 (F_1(x)=e^{-x}G_1(x)),其中 (e^{-x}=sum_i (-1)^ifrac{x^i}{i!})

    也就是 (f'_k=sum_{j=0}^kfrac{(-1)^{k-j}}{(k-j)!}g'_j)

    (k!f_k=sum_{j=k}^nfrac{(-1)^{j-k}}{(j-k)!}j!g_j)

    (f_k=sum_{j=k}^ninom jk(-1)^{k-j}g_j)。事实上啊,

    [g_k=sum_{j=k}^ninom jk f_jLeftrightarrow f_k=sum_{j=k}^ninom jk(-1)^{k-j}g_j ]

    这个式子就是二项式反演了。二项式反演还有更好看的形式:

    [f_n=sumlimits_{j=0}^n(-1)^j{nchoose j}g_jLeftrightarrow g_n=sumlimits_{j=0}^n(-1)^j{nchoose j}f_j ]

    min-max 容斥

    再看看这个容斥的式子:

    (A_1)(A_n)(n) 个集合,(U={1,2,cdots ,n})。那么( |igcup_{i=1}^n A_i|=sum_{Ssubset U,S e emptyset}(-1)^{|S|-1}|igcap_{iin S}A_i| )
    试试把 (igcup) 换成 (max),把 (igcap) 换成 (min),集合 (A_i) 改成数 (a_i) 吧。那么得到:

    [max_{i=1}^n a_i=sum_{Ssubset U,S e emptyset}(-1)^{|S|-1}min_{iin S}a_i ]

    举个例子:
    ( max{2,3,4}\ =min{2}+min{3}+min{4}-min{2,3}-min{2,4}-min{3,4}+min{2,3,4}\ =2+3+4-2-2-3+2 =4 )

    你发现它竟然是对的!

    能证明吗?

    一样的思路,不妨假设 (a_1le a_2le cdotsle a_n)。考虑 (a_x) 被算到的次数,为:
    (sum_{i=0}^{n-x}inom {n-x}i (-1)^{n-x})
    (它要是子集的最小值,该子集的其他元素就只能选后面的)。

    (k<n) 时,化为 ((-1+1)^{n-k}=0);当 (k=n) 时,化为 (1)

    故只有最大的那个值贡献到了答案,它就是对的。这就是 min-max 容斥。

    但是你觉得这个东西很蠢,最大值明明可以直接算。

    之所以要拿出来说,是因为 min-max 容斥在期望下也是对的。

    也就是说,

    [E(max_{i=1}^n x_i)=sum_{Ssubset U,S e emptyset}(-1)^{|S|-1}E(min_{iin S}x_i) ]

    成立。


    举例说明:袋子里有 (n(nle 20)) 种颜色的球,每一回合你会拿出一个球然后放回,摸出的球为第 (i) 种颜色的概率为 (p_i(sum p_i=1))。求期望多少回合后,每种颜色都摸到过至少一次。(HDU4336)

    设第 (i) 种颜色期望 (x_i) 次被第一次摸到,则答案是 (E(max_{i=1}^n x_i))

    你发现 (E(max x_i)) 不好求,(E(min_{iin S}x_i)) 还比较好求,为 (frac{1}{sum_{iin S} p_i})

    套用刚刚的式子,就得到
    ( E(max_{i=1}^n x_i)\ =sum_{Ssubset U,S e emptyset}(-1)^{|S|-1}E(min_{iin S}x_i)\ =sum_{Ssubset U,S e emptyset}(-1)^{|S|-1}frac{1}{sum_{iin S} p_i} )

    (n) 只有 (20),直接算就行了。


    Wait! 但是我们还没证明 min-max 容斥在期望下也是对的呢!

    考虑在这里计算期望的一种方法:

    (E(max_{i=1}^n x_i)=sum_tP(x=t)max_{i=1}^n t_i)
    (E(min_{i=1}^n x_i)=sum_tP(x=t)min_{i=1}^n t_i)

    其中 (t) 是一个长度为 (n) 的序列。

    (E(max_{i=1}^n x_i)\ =sum_tP(x=t)max_{i=1}^n t_i\ =sum_tP(x=t)sum_{Ssubset U,S e emptyset}(-1)^{|S|-1}min_{iin S}t_i\ =sum_{Ssubset U,S e emptyset}(-1)^{|S|-1}sum_tP(x=t)min_{iin S}t_i\ =sum_{Ssubset U,S e emptyset}(-1)^{|S|-1}E(min_{iin S}x_i) )

    嗯,这样就证完了,也没啥意思。


    还有更强的式子
    (U={1,2,cdots ,n})(operatorname{kthmax}_{i=1}^n a_i)(a) 数组的第 (k) 大值,则:

    [operatorname{kthmax}_{i=1}^n a_i=sum_{Ssubset U,S e emptyset}(-1)^{|S|-k}inom{|S|-1}{k-1}min_{iin S}a_i ]

    (规定 (n<m)(inom nm=0)

    证明:
    不妨假设 (a_1le a_2le cdotsle a_n)
    (sum_{Ssubset U,S e emptyset}(-1)^{|S|-k}inom{|S|-1}{k-1}min_{iin S}a_i\ =sum_{i=1}^n a_isum_{Ssubset U,S e emptyset}(-1)^{|S|-k}inom{|S|-1}{k-1}[a_i=min_{jin S}a_j]\ =sum_{i=1}^n a_isum_{j=k}^ninom{n-i}{j-1}inom{j-1}{k-1}(-1)^{j-k})
    对于组合数,有等式 (inom abinom bc=inom acinom{a-c}{b-c})。于是:
    ( =sum_{i=1}^n a_isum_{j=k}^ninom{n-i}{k-1}inom{n-i-k+1}{j-k}(-1)^{j-k}\ =sum_{i=1}^n a_iinom{n-i}{k-1}sum_{j=k}^ninom{n-k+1-i}{j-k}(-1)^{j-k}\ =sum_{i=1}^n a_iinom{n-i}{k-1}sum_{j=0}^{n-k+1-i}inom{n-k+1-i}{j}(-1)^{j} )
    (i=n-k+1) 时,(inom{n-i}{k-1}sum_{j=0}^{n-k+1-i}inom{n-k+1-i}{j}(-1)^{j}=1)
    否则 (inom{n-i}{k-1}sum_{j=0}^{n-k+1-i}inom{n-k+1-i}{j}(-1)^{j}=0)
    所以 (sum_{i=1}^n a_iinom{n-i}{k-1}sum_{j=0}^{n-k+1-i}inom{n-k+1-i}{j}(-1)^{j}=operatorname{kthmax}_{i=1}^n a_i)
    于是证完了。

    于是又有

    [E(operatorname{kthmax}_{i=1}^n x_i)=sum_{Ssubset U,S e emptyset}(-1)^{|S|-k}inom{|S|-1}{k-1}E(min_{iin S}x_i) ]

    EXTRA

    其实还有一个关于 (gcd)(operatorname{lcm}) 的容斥。

    它长这样:(operatorname{lcm}_{i=1}^n a_i=prod_{Ssubset U,S e emptyset}(gcd_{iin S}a_i)^{(-1)^{|S|-1}})

    其中 (U={1,2,cdots ,n})

    为什么对?你考虑 (a_i=prod_k p_k^{alpha_k})

    • 取两个数的 (gcd) 就是每个 (alpha)(min)
    • 取两个数的 (operatorname{lcm}) 就是每个 (alpha)(max)
    • 两个数相乘就是 每个 (alpha) 求和;
    • 两个数相除就是 每个 (alpha) 求差。

    于是那个式子就相当于对每个 (alpha) 同时搞了个 min-max 容斥,自然就是对的了。

    例题

    二项式反演

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

    luogu P4491 染色

    luogu P5401 珍珠

    min-max 容斥

    HDU 4336 Card Collector

    luogu P3175 按位或

    HDU4624 Endless Spin

    BZOJ 4833 最小公倍佩尔数

    luogu P4707 重返现世

    AGC 038E Gachapon

  • 相关阅读:
    关于联想笔记本ThinkPad E470 没有外音 插耳机却有声音的解决办法
    Win10无法启动软件提示MSVCP110.dll丢失
    POJ-3984 迷宫问题(BFS找最短路径并保存)
    转圈游戏(简单的快速幂)
    统计一个整数的二进制中1的个数(暴力)
    手写哈希(实现简单的加数、查询)
    CodeForces
    L2-2 社交集群 (25 分)(一个写挫的并查集)
    7-4 交换二叉树中每个结点的左孩子和右孩子 (20 分)
    7-3 堆中的路径 (25 分)
  • 原文地址:https://www.cnblogs.com/Camp-Nou/p/12811893.html
Copyright © 2011-2022 走看看