zoukankan      html  css  js  c++  java
  • 【总结】容斥原理与反演

    【总结】容斥原理与反演

    这个是个好东西...实际上,容斥和反演没有什么区别。

    【题解】CF997C Sky Full of Stars

    【题解】CF451E Devu and Flowers(容斥)

    【题解】CJOI2019 登峰造鸡境 (Prufer序列+斯特林数)

    【题解】CF559C C. Gerald and Giant Chess(容斥+格路问题)

    【总结】组合模型及其组合意义的阐释

    【题解】分特产(组合数+容斥)

    【题解】Counting D-sets(容斥+欧拉定理)

    【题解】Codeforces 961G Partitions

    【题解】HAOI2018]染色(NTT+容斥/二项式反演)

    【题解】BZOJ5093图的价值(二项式+NTT)

    普通的容斥原理

    这里直接用式子说明关系,想进一步了解去看组合数学((U={dots A_n}))

    [|igcup_{A in U} A|=sum_{u subseteq U} (-1)^{|u|+1}|igcap_{A in u } A| ]

    著名的奇加偶减。

    不是很好用

    广义容斥原理/二项式反演

    [f(x)=sum_{uin U ,|u|=x} |igcap_{A in u}A | ]

    假如(forall |u|=x)

    [|igcap_{A in u}A |=g(x) ]

    那么有

    [g(x)=sum_{i=x}^{|U|} (-1)^{i-x}{|U|choose i } f(i) ]

    写在一起

    [f(x)=sum_{i=0}^{|U|} {|U|choose i} g(i) Leftrightarrow g(x)=sum_{i=x}^{|U|} (-1)^{i-x}{|U|choose i } f(i) ]

    著名的二项式反演。证明方法可以直接带进去。下面给出另一个证明

    怎么发现这个公式?实际上是对于每个元素单独分析存在的方式,我抄一下我之前写过的证明

    由于对于每个有(u)种颜色出现(S)的方案,有三种状态:

    • (u)少于目标(x)时:在(f(x))中被计算了(0)次。

    • (u)等于目标(x)时:在(f(x))中只被计算了(1)次。

    • (u)大于目标(x)时:

      考虑这个方案,在(f(x))(f(u))之中分别计算了

      [{uchoose x},{uchoose x+1},dots{uchoose u} ]

      次,很像一个二项式定理展开。

      然后我们考虑一下({x+ichoose x}f(x+i))的情况

      [{uchoose x}{xchoose x},{uchoose x+1}{x+1choose x},dots{uchoose u}{uchoose x} ]

      晓得一个公式,那就是

      [{achoose b}{bchoose c}={achoose c}{a-cchoose b-c} ]

      传送门:【总结】组合模型及其组合意义的阐释

      用这个公式化简一下上面那个式子

      [sum_{i=0}^{u-x}{uchoose x}{u-xchoose i} ]

      好家伙,右边就是一个二项式定理啊!

      继续化简

      [={uchoose x}sum_{i=0}^{u-x}{u-xchoose i}={uchoose x}(1+1)^{u-x} ]

      现在我们要让等式右边变成

      [0={uchoose x} imes 0={uchoose x}(1-1)^{u-x} ]

      我们在(f(i))前面乘上一个容斥系数即可。此时,(ule x)的情况不受影响。

      [sum_{i=x}^L (-1)^{i-x}{ichoose x}f(i)=g(x) ]

    自然幂数和/斯特林反演

    [n^k=sum_{i=1}^{min {n,k}}{k race i}{n choose i}i! ]

    直接带入斯特林数的容斥式子显然是可以证明的,但这里我给出一个很有意思的证明

    [n^k={underbrace {(1+1dots +1}_{n ext{个}})}^k=underbrace{underbrace {(1+dots +1)}_{n ext{个}}underbrace {(1+dots +1)}_{n ext{个}} dotsunderbrace {(1+dots +1)}_{n ext{个}}}_{k ext{个}} ]

    所有的"(1)"都是有区别的。现在问题就变成了存在多少种方案把所有从左往右(1)乘出来,方案总数就是(n^k)

    假设有一个小人从左边走到右边,每经过一个括号就捡起来一个1,括号里的1是不同的,问这个小人有多少种捡1的方式?

    我们把他所有最后捡起来的1分类,假如说它第一次选择了第一个1,第二次选择第三个1,第三次选择了第五个一,我们记录成数列(135)

    显然小人捡出来的序列的形式是这样的

    [underbrace{1quad 2quad1quad233quad666 dots3}_{k ext{个}} ]

    再把这样的序列分类,可以分为(min {n,k})类,分类的标准是,出现了几个不同的数。就比如序列 (1 quad 1 quad 233)中就有两个不同的数。假设我这个序列是类别(i),那么这个类别内总共有(n choose i)种数的出现情况。为什么对(k)(min),因为我序列总共都只有(k)那么长...

    然后我现在有(k)个位置,要让这(k)个位置都是我选出来的数共(i)种,并且每个数都要出现。

    斯特林数(k race i)就表示(k)个不同元素划分为(i)个非空集合的方案数,集合没有区别。然而我这里的"集合"显然是有区别的,所以要用(i!)补回来。

    所以类别(i)总共有

    [{k race i}{n choose i}i! ]

    个不同方案,然而我总共会有(min {n,k})类,而且不会有类型(0)的存在,所以

    [n^k=sum_{i=1}^{min {n,k}}{k race i}{n choose i}i! ]

    所以这个东西有什么用?直接用途是BZOJ5093图的价值和CF932E Team Work ,其实用途就是把指数变成组合数,还是一个上定下变的组合数,变的还是从(1)(n)的,可以运用备胎模型产生奇妙的化简,然后用二项式定理。还有就是这个式子枚举的边界是(min {n,k})不可能哪个题目毒瘤到(n=1e9,k=1e9+7)吧...

    莫比乌斯反演

    可能最常见的定义式是这样的:

    [(2)F(x)=sum_{d|x}f(d) leftrightarrow f(x)=sum_{d|x}mu(d)F(x/d) \or \ (3)F(x)=sum_{x|d}f(d) leftrightarrow f(x)=sum_{x|d}mu(d/x)F(d) ]

    一般来说,容斥用上面那个,数论用下面这个比较方便。

    [(1)sum_{d|n}mu(d)=[n=1] ]

    假如一个式子里有乘积+约数或者什么什么+布尔值,那就套一下这个公式。

    这个式子如何证明:

    • 考虑枚举因数就相当于对于(n=prod p_i^{a_i})选不同的乘起来,你知道当(d)在一个(p_i)中选了超过一的指数,由于此时(exist x^2|n)所以(mu(n)=0)我们就可以不考虑它了。

      所以情况只剩下选择不同的(p_i)了,等式就变成了我们选几个不同的素因子:(sum C_n^i (-1)^i),我们直接二项式定理可以得到等式(=(-1+1)^n=0)

      (n=1) 时的证明显然。

    那么我们承认((1))是我们的定义,证明((2)(3))

    都是我自己证的,相信一定比较好理解

    • ((1)->(2))

      • (sum_{d|x}mu(d)F(x/d))
      • (=sum_{d|x}mu(x/d)F(d)dots)等价写法
      • (=sum_{d|x}mu(x/d)sum_{k|d}f(k)dots)套条件
      • (=sum_{k|x}f(k)sum_{d|frac x k}mu(d)dots)等价写法
      • (=sum_{k|x}f(k)[frac x k=1]dots)((3))的公式
      • (=f(x))
    • ((1)->(3))

      • (=sum_{x|d}mu(d/x)F(d)dots)等价写法
      • (=sum_{x|d}mu(d/x)sum_{d|k}f(k) dots)套条件
      • (=sum_{x|k}f(k)sum_{x|d,d|k}mu(d/x)dots)改变枚举顺序,先枚举(k)
      • (=sum_{x|k}f(k)sum_{d|frac d x}mu(d)dots)等价写法
      • (=sum_{x|k}f(k)[frac k x=1]dots)((3))的公式
      • (=f(x))

    好吧我承认这样写有点不负责,因为"等价写法"在我看来是坠难的,因为我想了一节晚自习。等价写法不好讲,我只能保证是等价的,具体如何理解评论区讨论吧...

    总结一下我们的证明思路,或者说如何感性理解它 :

    我们知道(sum_{d|n}mu(d)=[n=1]),这是一个很强的性质,我们把函数(f(x))乘在(mu)的后面,这样我们函数sum起来就和(mu)有关了,所以我们要令(n=frac x m)使得当(x=m)时才有值,这样最后等式只剩下(f(m))了,也达到了我们反演的目的。

    考虑这样的等价写法就是考虑两个等式最终加起来的式子是否不重不漏,理论依据是加法交换律和乘法分配律...

  • 相关阅读:
    物联网普而不及 仍缺杀手级应用
    05-if和switch的简单比较
    05-if使用注意
    04-关系运算符使用注意
    03-sizeof的用法
    01-scanf函数的注意点
    01-变量的内存分析
    06-自定义构造方法
    06-构造方法
    05-id的使用
  • 原文地址:https://www.cnblogs.com/winlere/p/11196156.html
Copyright © 2011-2022 走看看