容斥原理 数论

容斥原理 数论文章目录原理证明例题原理 S1 S2 S3 分别代表下图三个圆 1 2 3 的面积如果我们想求下面图形构成的面积 该怎么求呢 很简单 S S1 S2 S3 S1 S2 S3 S1 S2 S1 S3 S2 S3 S1 S2 S3 拓展一下 如果是 4 个圆的面积应该是 S S1 S2 S3 S4 S1 S2 S3 S4 S1 S2 S1 S3 S1 S4 S2 S3 S2 S4 S3

文章目录

原理

S1、S2 、S3 分别代表下图三个圆1、2、3的面积
如果我们想求下面图形构成的面积,该怎么求呢,很简单
S = S1 ∪ S2 ∪ S3=
S1 + S2 + S3
-S1 ∩ S2 – S1 ∩ S3 – S2 ∩ S3
+S1 ∩ S2 ∩ S3
在这里插入图片描述
拓展一下,如果是4个圆的面积应该是
S =S1 ∪ S2 ∪ S3 ∪ S 4 =
















S1 + S2 + S3 + S4

-S1 ∩ S2 – S1 ∩ S3 – S1 ∩ S4 – S2 ∩ S3 – S2 ∩ S4 – S3 ∩ S4

+S1 ∩ S2 ∩ S3 + S1 ∩ S2 ∩ S4 + S1 ∩ S3 ∩ S4 + S2 ∩ S3 ∩ S4

-S1 ∩ S2 ∩ S3 ∩ S4

可以发现规律 ,S1 ∪ S2 ∪ … ∪ S n = ( ∑ i = 1 n \sum_{i=1}^n i=1nSi) – ( ∑ i , j = 1 n \sum_{i,j=1}^n ij=1n Si ∩ Sj) + ( ∑ i , j , k = 1 n \sum_{i,j,k=1}^n ijk=1n Si ∩ Sj ∩ Sk) -…+ ((-1)n-1 ∑ i , j , k . . . . = 1 n \sum_{i,j,k….=1}^n ijk....=1n Si ∩ Sj ∩ Sk ∩…∩ Sn)

上面的是用面积来考虑,如果我们用集合来考虑的话, 若 |S| 代表3个集合并集元素的个数,则:

|S| = |S1 ∪ S2 ∪ S3|=
|S1| + |S2| + |S3|
-|S1 ∩ S2| – |S1 ∩ S3| – |S2 ∩ S3|
+|S1 ∩ S2 ∩ S3|






设 n 个集合并集的元素个数为 |S1 ∪ S2 ∪ … ∪ S n|

那么,|S1 ∪ S2 ∪ … ∪ S n| = ( ∑ i = 1 n \sum_{i=1}^n i=1n|Si|) – ( ∑ i , j = 1 n \sum_{i,j=1}^n ij=1n| Si ∩ Sj|) + ( ∑ i , j , k = 1 n \sum_{i,j,k=1}^n ijk=1n |Si ∩ Sj ∩ Sk|) -…+ ((-1)n-1 ∑ i , j , k . . . . = 1 n \sum_{i,j,k….=1}^n ijk....=1n |Si ∩ Sj ∩ Sk ∩…∩ Sn|) ,这就是容斥原理的公式

很容易发现,如果某一项包含奇数个集合时,那么它的符号就是”“,反之,某一项包含偶数个集合时,它的符号就是”“。


证明

上面已经知道计算 3 个集合的并集的元素个数的式子有 7 项,计算4 个集合并集的元素个数的式子有 15 项。

大胆猜测一下,计算 n 个集合的并集的元素个数的式子一共有 2n – 1 项。

①等式右边代表从 n 个数中选任意多个数的方案数,因为第一个数选或不选有两种方案,第二个数选或不选两种方案,第三个数…第n个数…总共 2n
②等式左边代表从 n 个数中选 0 个数的方案数 + 从 n 个数中选 1 个数的方案数 + … +从 n 个数中选 n 个数的方案数。

很明显,①②两者的意义是相同的,所以等号成立。

C ( 1 n ) \tbinom{1}{n} (n1) + C ( 2 n ) \tbinom{2}{n} (n2) + C ( 3 n ) \tbinom{3}{n} (n3) + … + C ( n n ) \tbinom{n}{n} (nn) = 2n – 1,得证


例题

在这里插入图片描述
样例:

所以,5 + 3 – 1 = 7 个

思路:二进制,已知共有 2m – 1 项,每一项所包含的质数都不同,我们可以用 1~2m-1 这 2m – 1 个数,来表示不同的项,每个数都转换成 m 位二进制数后,这 m 位就分别代表着 m 个质数是否包含,1代表包含,0代表不包含

AcWing 890. 能被整除的数

#include 
       using namespace std; typedef long long LL; const int N = 20; int n,m; int p[N]; int main() { 
      cin >> n >> m; for(int i = 0; i < m; i++) cin >> p[i]; int res = 0; for(int i = 1; i< 1 << m; i++) // 1~2^m-1这些数代表2^m-1个不同的项 { 
      int t = 1, cnt = 0; //cnt代表当前枚举的项中包含集合的个数  for(int j=0; j<m; j++)//看这个项的第 j 位是否包含,1代表包含,0代表不包含  if(i >> j & 1) //选  { 
      if((LL)t * p[j] > n) //此时 n/t = 0,直接break即可  { 
      t = -1; break; } cnt++; t *= p[j]; } if(t != -1) { 
      if(cnt % 2) res += n/t; //加奇数项的个数  else res -= n/t; //减偶数项的个数  } } cout << res; } 

时间复杂度:O(2^m * m)


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/224234.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午12:24
下一篇 2026年3月17日 下午12:24


相关推荐

  • listagg within group函数的作用_oracletochar函数

    listagg within group函数的作用_oracletochar函数前言:最近在写一些比较复杂的SQL,是一些统计分析类的,动不动就三四百行,也是首次写那么长的SQL,有用到一些奇形怪状的SQL函数,在这里结合网上的例子做一些笔记,以后用到不记得用法可以翻出来看!1.基础用法:LISTAGG(XXX,XXX)WITHINGROUP(ORDERBYXXX),就像聚合函数一样,通过Groupby语句,把每个Group的一个字段,拼接起来…

    2025年9月29日
    8
  • linux桌面系统 9,红旗Linux系统RedFlag Linux Desktop 9.0安装教程

    linux桌面系统 9,红旗Linux系统RedFlag Linux Desktop 9.0安装教程以下分享红旗Linux操作系统RedFlagLinuxDesktop9.0安装教程,你可以用Vmware、VirtualBox虚拟机、硬盘、U盘、光盘的方式来安装。本文以光盘的方式来演示安装RedFlagLinuxDesktop9.0全过程。安装RedFlagLinuxDesktop9.0至少需要如下基本硬件配置:1.Intel或AMDCPU,推荐使用2GB以上内存。2.最少…

    2022年8月20日
    10
  • Mac 卸载Java「建议收藏」

    Mac 卸载Java「建议收藏」Mac彻底卸载Javamac上终端安装了太多的JavaJDK版本,计划全部删除,重新安装最新版本JDK。打开终端输入以下命令://1、移除JavaAppletPlugin.plugin与JavaControlPanel.prefpanesudorm-fr/Library/Internet\Plug-Ins/JavaAppletPlugin.pluginsudorm-fr/Library/PreferencesPanes/JavaControlPanel.prefpane

    2022年5月19日
    85
  • ubuntu clion2021 激活码-激活码分享[通俗易懂]

    (ubuntu clion2021 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1STL5S9V8F-eyJsaWNlbnNlSW…

    2022年3月27日
    205
  • Linux 端口被进程多次占用,LINUX最好用查看端口占用并杀死(kill)的方式「建议收藏」

    Linux 端口被进程多次占用,LINUX最好用查看端口占用并杀死(kill)的方式

    2022年2月9日
    84
  • Pycharm—修改背景颜色和背景图片

    Pycharm—修改背景颜色和背景图片文章目录一 修改背景颜色二 修改背景图片一 修改背景颜色 1 单击 File gt Settings2 单击 Editor gt ColorScheme gt 选择 Scheme 注意这里的 ColorScheme 是单击 不要点击左边的小三角 3 点击右下 Apply gt Yes 大功告成 二 修改背景图片 1 打开 Settings2 点击 Appearance amp Behavior gt

    2026年3月27日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号