• 容斥原理学习笔记


    公式

    并集

    $$left|igcup_{i=1}^nS_i ight|=sum_i|S_i|-sum_{i<j}|S_icap S_j|+sum_{i<j<k}|S_icap S_jcap S_k|-cdots+(-1)^{n-1}|S_1cap cdotscap S_n|$$

     证明

    对于元素$x$,假设它属于的集合为$T_1,T_2,ldots,T_m$,那么它对答案的贡献为:

    $$|{T_i}|-|{T_icap T_j|i<j}|+|{T_icap T_jcap T_k|i<j<k}|-cdots+(-1)^{m-1}|{T_1cap T_2cap cdotscap T_m}|\=inom{m}{1}-inom{m}{2}+cdots+(-1)^{m-1}inom{m}{m}=1$$

    于是每个元素都只被计算了一次,总和即为并集的大小

     

    交集

    $$left|igcap_{i=1}^nS_i ight|=|U|-left|igcup_{i=1}^noverline{S_i} ight|$$

    其中$U$为全集,$overline{S}$为$S$对$U$的补集

    计算时可对右边补集的并进行容斥

    证明

    若$xinigcupoverline{S_i}$,则$exists i,x otin S_i$,即$x$不存在与交集中,贡献为0,反之贡献为1

    于是最后总和为交集的大小

    例题

    错排问题

    求出满足以下条件的长度为$n$的排列$p$的个数:$forall i,p_i eq i$

    解法

    考虑容斥:
    设$S_i$表示满足$p_i eq i$的排列$p$的集合,那么题目要求的是$|igcap S_i|$

    根据公式:

    $$Ans=left|igcap_{i=1}^nS_i ight|=|U|-left|igcup_{i=1}^noverline{S_i} ight|\=|U|-sum_i|overline{S_i}|+sum_{i<j}|overline{S_i}capoverline{S_j}|-cdots-(-1)^{n-1}|overline{S_1}cap cdotscapoverline{S_n}|$$

    注意到:

    $$forall a_1<a_2<cdots<a_m,left|igcap_{i=1}^moverline{S_{a_i}} ight|=(n-m)!$$

    于是:

    $$Ans=sum_{m=0}^n(-1)^msum_{a_i<a_2<cdots<a_m}left|igcap_{i=1}^moverline{S_{a_i}} ight|=sum_{i=0}^n(-1)^iinom{n}{i}(n-i)!=n!sum_{i=0}^nfrac{(-1)^i}{i!}$$

    那么就可以愉快的$O(n)$求了

    方格染色问题:

    有一个n行m列的方格,初始均为白色,可以选择一些格子染黑,问满足每行每列至少有一个黑格子的方案数

    解法

    和上题思路差不多,先求出至少有$i$行$j$列没有黑格子的方案数,为$2^{(n-i)(m-j)}$

    根据容斥原理:

    $$Ans=sum_{i=0}^nsum_{i=0}^m(-1)^{(i+j)}inom{n}{i}inom{m}{j}2^{(n-i)(m-j)}$$

    效率$O(n^2)$

    其它题目

    [HAOI2008]硬币购物

    [THUPC2019]过河卒二

    [FJOI2017]矩阵填数

  • 相关阅读:
    基于bootsplash的嵌入式linux启动画面定制
    Android程式编写及调试新手入门3
    linux2.6 内核的 initrd
    exec与xargs区别 Leone
    jquery扩展方法:jquery.fn.extend与jquery.extend Leone
    MySQL查询in操作 查询结果按in集合顺序显示 Leone
    CentOS Linux Vsftp服务器配置 Leone
    linux[批量复制并重命名]和[批量复制文件到多个文件夹] Leone
    学会了这些保你5年内买车买房 Leone
    国外网赚项目的分类 Leone
  • 原文地址:https://www.cnblogs.com/Y25t/p/12237303.html
Copyright © 2020-2023  润新知