首页 > 编程语言 >[算法] 容斥

[算法] 容斥

时间:2024-10-04 21:50:18浏览次数:6  
标签:bigcup big sum cap 容斥 overline 算法

对于某些毒瘤计数题,经常会出现统计重复或遗漏的问题,这时候就可能需要容斥一下

容斥原理

先从一个经典的例子入手:有三个学科,设为 $ S_1, S_2, S_3 $,有一堆人选不同的学科,现已知选每门学科各自有多少人选,求一共有多少人选学科;

根据题意,我们要求的就是:$ \mid S_1 \bigcup S_2 \bigcup S_3 \mid $;

考虑咋求,这是一个小学数学问题,直接用 $ |S_1| + |S_2| + |S_3| - |S_1 \bigcap S_2| - |S_2 \bigcap S_3| - |S_1 \bigcap S_3| + |S_1 \bigcap S_2 \bigcap S_3| $ 算一下即可;

其实这就是一个容斥;

扩展一下,将 $ S $ 抽象为若干个集合,对于 $ S_1, S_2, ... , S_n $,我们要求 $ | \bigcup_{i = 1}^{n} S_i | $,那么我们可以得到:

\[\big | \bigcup_{i = 1}^{n} S_i \ \big | \ = \ \sum_{i} |S_i| - \sum_{i < j} |S_i \cap S_j| + \sum_{i < j < k} |S_i \cap S_j \cap S_k| ... \]

这就是容斥原理

简记为:奇加偶减

对于其补集同理,有:

\[\big | \bigcup_{i = 1}^{n} \overline{S_i} \ \big | \ = \ \sum_{i} |\overline{S_i}| - \sum_{i < j} |\overline{S_i} \cap \overline{S_j}| + \sum_{i < j < k} |\overline{S_i} \cap \overline{S_j} \cap \overline{S_k}| ... \]

那么,对于集合的交,我们不难得到:

\[\big | \bigcap_{i = 1}^{n} S_i \big | = |U| - |\bigcup_{i = 1}^n \overline{S_i}| \]

其中 $ U $ 代表全集;

对于右者使用容斥原理即可;

这就是比较常用的三个公式(其实都差不多);

应用

不定方程非负整数解计数

这是本篇文章主要研究的问题;

问题: 给出不定方程 $ \sum_{i = 1}^n a_i = m $ 以及 $ n $ 个形如 $ a_i \leq b_i $ 的限制,求合法非负整数解的个数;

没有限制

我们看作有 $ n $ 个盒子,各个盒子放的球数就是对应一位 $ a $ 的值,有 $ m $ 个相同小球,盒子可以为空,求将小球放入盒子中的方案数;

如果每个盒子至少有一个球的话,那么我们可以用插板法来做,对于可以为空的情况,我们可以再加 $ n $ 个球依次放入每个盒子中,那么问题就转化成有 $ n + m $ 个小球,放入 $ n $ 个盒子中,用插板法做就是 $ \operatorname{C}_{n + m - 1}^{n - 1} $;

扩展一下,对于形如 $ \sum_{i = 1}^n a_i = m $ 以及 $ n $ 个形如 $ a_i \geq b_i $ 的限制的问题,我们可以先把对应位置放上其对应的 $ b $,那么依据上述思路答案为:

\[\operatorname{C}_{n + m - \sum_{i = 1}^{n} b_i - 1}^{n - 1} \]

其实上述问题就是 $ \forall i \in [1, n], b_i = 0 $ 的特殊情况;

有限制

发现我们按照没有限制做会算多 $ a_i \geq b_i + 1 $ 的情况,那么我们需要容斥掉它;

考虑刚刚容斥原理中的第三个公式,答案可表示为:

\[\big | \bigcap_{i = 1}^{n} S_i \big | = |U| - |\bigcup_{i = 1}^n \overline{S_i}| \]

其中对于 $ |\bigcup_{i = 1}^n \overline{S_i}| $,(就是 $ a_i \geq b_i + 1 $)我们应用第二个公式展开一下,得到:

\[\big | \bigcup_{i = 1}^{n} \overline{S_i} \ \big | \ = \ \sum_{i} |\overline{S_i}| - \sum_{i < j} |\overline{S_i} \cap \overline{S_j}| + \sum_{i < j < k} |\overline{S_i} \cap \overline{S_j} \cap \overline{S_k}| ... \]

随便提出一项 $ |\overline{S_i} \cap \overline{S_j} \cap \overline{S_k}| $,我们考虑它的实际意义,为 $ \sum_{i = 1}^n a_i = m $ 以及 $ 3 $ 个形如 $ a_i \geq b_i + 1 $, $ a_j \geq b_j + 1 $ $ a_k \geq b_k + 1 $ 的限制,求其方案数,依据上面的思路,可得答案为:

\[\operatorname{C}_{n + m - (b_i + 1) - (b_j + 1) - (b_k + 1) - 1}^{n - 1} \]

其他项同理;

标签:bigcup,big,sum,cap,容斥,overline,算法
From: https://www.cnblogs.com/PeppaEvenPig/p/18447358

相关文章

  • 代码随想录算法训练营day3|● 203.移除链表元素 ● 707.设计链表 ● 206.反转链表
    学习资料:https://programmercarl.com/链表理论基础.html#链表的类型可设置虚拟头结点dummy_head链表最后指向Null一个节点包含值和索引学习记录:203.移除链表元素(基本ListNode(),cur.next,cur.next.val)点击查看代码#Definitionforsingly-linkedlist.#classListNod......
  • YOLOv8算法改进【NO.138】基于细节增强卷积改进YOLO算法
     前  言    YOLO算法改进系列出到这,很多朋友问改进如何选择是最佳的,下面我就根据个人多年的写作发文章以及指导发文章的经验来看,按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通:首推,是将两种最新推出算法的模块进行融合形成......
  • YOLOv10/8算法改进【NO.139】借鉴RCS-YOLO算法改进
     前  言    YOLO算法改进系列出到这,很多朋友问改进如何选择是最佳的,下面我就根据个人多年的写作发文章以及指导发文章的经验来看,按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通:首推,是将两种最新推出算法的模块进行融合形成......
  • 9-贪心算法
    参考:代码随想录题目分类大纲如下:贪心算法理论基础什么是贪心?贪心的本质是选择每一阶段的局部最优,从而达到全局最优。贪心的套路(什么时候用贪心)贪心算法并没有固定的套路,说白了就是常识性推导加上举反例。靠自己手动模拟,如果模拟可行,就可以试一试贪心策略,如果不可行,可能需要......
  • 算法
    常见的算法思想比较笨的穷举算法思想又称为枚举法把所有可能枚举一边,效率低。递推从已知到未知,从小到大典型代表:斐波那契数列,由前两项推后一项递归指一种直接或间接地调用原算法本身的算法在程序中不断反复的调用自身来达到求解问题的方法递归调用实际上是自身调用自身......
  • 洛谷P10336 [UESTCPC 2024] 2-聚类算法
    涉及知识点:博弈、贪心题意Alice和Bob在玩选点游戏,所有的点在一个\(k\)维空间中,他们轮流选走一个点放入自己的集合中,Alice先手。定义集合\(S\)的权值\(val(S)\)为集合中点两两之间的\(k\)维曼哈顿距离之和。Alice的得分为\(val(S_A)-val(S_B)\),Bob的得分为\(val(......
  • 代码随想录算法训练营 | 134. 加油站,135. 分发糖果,860.柠檬水找零,406.根据身高重建队
    134.加油站题目链接:134.加油站文档讲解︰代码随想录(programmercarl.com)视频讲解︰加油站日期:2024-10-04想法:1.总汽油大于等于消耗一定能跑完,2.当前剩余汽油小于0了,只能从下一站开始重新计算Java代码如下:classSolution{publicintcanCompleteCircuit(int[]gas,int......
  • 改进的匿名多智能体路径查找算法
    本文提出了一种改进的匿名多智能体路径寻找算法(AMAPF),旨在解决多个未标记的智能体在一个共享环境中从初始位置无冲突地移动到指定目标位置的问题。该研究通过将AMAPF问题转化为辅助图上的最大流问题,并采用了一种新颖的搜索算法,该算法不是单独考虑各个搜索状态,而是同时处理大量状态,以......
  • 使用鼠标点击矩阵上下左右的数字初始化为1 计算所需总共点击次数矩阵所有数字变成1的
    1importjava.util.ArrayList;23publicclassHuaweiTest2{4publicstaticvoidmain(String[]args){5//System.out.println("HelloWorld!");6}78publicstaticIntegergetMilliSecondsForInputInicialize......
  • 文心一言 VS 讯飞星火 VS chatgpt (360)-- 算法导论24.3 2题
    二、请举出一个包含负权重的有向图,使得Dijkstra算法在其上运行时将产生不正确的结果。为什么在有负权重的情况下,定理24.6的证明不能成立呢?定理24.6的内容是:Dijkstra算法运行在带权重的有向图时,果所有权重为非负值,则在算法终止时,对于所有结点,我们有。如果要写代码,请用go......