容斥原理

1|0容斥原理

1|1基本概念

1|0容斥原理

在计数时,必须注意没有重复,没有遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。(摘自百度百科)

1|0举个栗子

  1. 三个集合:
    image
    三个集合s1,s2,s3, 目标是求解s1s2s3
    易知:

s1s2s3=(s1+s2+s3)(s1s2+s2s3+s1s3)+(s1s2s3)

  1. 四个集合:
    image
    四个集合:s1,s2,s3,s4, 目标是求解:s1s2s3s4
    那么:

s1s2s3s4=(s1+s2+s3+s4)(s1s2+s2s3+s1s3+s1s4+s2s4+s3s4)+(s1s2s3+s1s2s4+s4s2s3)(s1s2s3s4)

1|0容斥原理公式

|A1A2A3...Am|=

1im|Ai|1i<jm|AiAj|+1i<j<km|AiAjAk|...+(1)m1|A1A2A3...Am|

1|0规律:

奇数项为正, 偶数项为负.

2|0例题

2|1AcWing 890. 能被整除的数

原题链接

1|0题意

给定m个质数, 问1n中有多少个数能至少被m个数中的一个整除

1|0时间复杂度

m个质因数(即m个集合), 总共2m种组合方式, 每种组合方式对应二进制有m
可得时间复杂度:O(m×2m)

1|0思路

1|0Step 1

对于m个质数(p1,p2...pm), 每个数都存在这样一个集合:

S1:p1:p1,1p1,2p1...kp1

...

Sm:pm:pm,1pm,2pm...kpm

集合Si代表所有能够被pi整除的数.
那么根据题意, 我们目标就是求解

S1S2...Sm1Sm

中元素的个数
只要应用容斥原理即可.

1|0Step 2

我们发现:
1im|Ai| 是从i个集合中选择1个, 选法有Ci1
1i<jm|AiAj| 是从i个集合内选择2个, 选法有Ci2种.
...
那么选择容斥原理后, 还有一个问题要解决: 如何枚举公式中的每种情况?
我们采用二进制:
每个二进制数都由01组成, 那么对于每一位: 0代表选择这个集合, 1代表不选择这个集合
例如1010:代表有四个集合:选择集合1,3, 不选2,4
只要依次枚举12m1, 就可以枚举集合的所有选法
(其实: Cm0+Cm1+Cm2+...+Cmm=2m)

1|0Step 3

如何计算当前集合内能被1n整除的元素个数:

np1p2...pk

#include <iostream> #include <cstring> using namespace std; const int N = 20; int p[N]; int main() { int n, m; cin >> n >> m; for (int i = 0; i < m; i ++ ) cin >> p[i]; int res = 0; for (int i = 1; i < 1 << m; i ++ ){ int cnt = 0; int t = 1; for (int j = 0; j < m; j ++ ){ if (i >> j & 1){ //选择当前集合 cnt ++; if ((long long)t * p[j] > n){ t = -1; break; } t = (long long)t * p[j]; } } if (t != -1){ if (cnt % 2) res += n / t; else res -= n / t; } } cout << res << endl; return 0; }

__EOF__

本文作者lhqwd
本文链接https://www.cnblogs.com/lhqwd/p/14639348.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   lhqwd  阅读(790)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示