数据结构与算法学习笔记----容斥原理

数据结构与算法学习笔记----容斥原理

@@ author: 明月清了个风

@@ first publish time: 2025.1.30

ps⭐️介绍了容斥原理的相关内容以及一道对应的应用例题。


Acwing 890. 能被整除的数

原题链接\]([890. 能被整除的数 - AcWing题库](https://www.acwing.com/problem/content/892/)) 给定一个整数 n n n和 m m m个不同的质数 p 1 , p 2 , ⋯   , p m p_1,p_2,\\cdots,p_m p1,p2,⋯,pm。 请你求出 1 ∼ n 1 \\sim n 1∼n中能被 p 1 , p 2 , ⋯   , p m p_1,p_2,\\cdots,p_m p1,p2,⋯,pm中的至少一个数整除的整数有多少个。 #### 输入格式 第一行包含整数 n n n和 m m m。 第二行包含 m m m个质数。 #### 输出格式 输出一个整数,表示满足条件的整数的个数。 #### 数据范围 1 ≤ m ≤ 16 1 \\le m \\le 16 1≤m≤16, 1 ≤ n , p i ≤ 1 0 9 1 \\le n, p_i \\le 10\^9 1≤n,pi≤109 #### 思路 **容斥原理**是一种重要的组合数学方法,用于解决多个集合的元素计数问题。它的核心思想是通过对集合进行交集与并集的操作,减去重复计算的部分,从而准确地计算出多个集合的并集中元素的总数。 1. **两个集合的容斥原理**: 设 A A A和 B B B是两个集合,则它们的并集 A ∪ B A \\cup B A∪B的元素个数为: ∣ A ∪ B ∣ = ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ \|A \\cup B\| = \|A\| + \|B\| - \|A \\cap B\| ∣A∪B∣=∣A∣+∣B∣−∣A∩B∣ 其中, ∣ A ∣ \|A\| ∣A∣和 ∣ B ∣ \|B\| ∣B∣分别是集合 A A A和 B B B的元素个数, ∣ A ∩ B ∣ \|A \\cap B\| ∣A∩B∣是集合 A A A和 B B B的交集的元素个数。 2. **三个集合的容斥原理**: 设 A A A、 B B B和 C C C是三个集合,则它们的并集 A ∪ B ∪ C A \\cup B \\cup C A∪B∪C的元素个数为: ∣ A ∪ B ∪ C ∣ = ∣ A ∣ + ∣ B ∣ + ∣ C ∣ − ∣ A ∩ B ∣ − ∣ B ∩ C ∣ − ∣ C ∩ A ∣ + ∣ A ∩ B ∩ C ∣ \|A \\cup B \\cup C\| = \|A\| + \|B\| + \|C\| - \|A \\cap B\| - \|B \\cap C\| - \|C \\cap A\| + \|A \\cap B \\cap C\| ∣A∪B∪C∣=∣A∣+∣B∣+∣C∣−∣A∩B∣−∣B∩C∣−∣C∩A∣+∣A∩B∩C∣ 其中, ∣ A ∣ \|A\| ∣A∣、 ∣ B ∣ \|B\| ∣B∣和 ∣ C ∣ \|C\| ∣C∣分别是集合 A A A、 B B B和 C C C的元素个数, ∣ A ∩ B ∣ \|A \\cap B\| ∣A∩B∣、 ∣ B ∩ C ∣ \|B \\cap C\| ∣B∩C∣和 ∣ C ∩ A ∣ \|C \\cap A\| ∣C∩A∣分别是集合 A A A和 B B B、 B B B和 C C C、 C C C和 A A A的交集的元素个数, ∣ A ∩ B ∩ C ∣ \|A \\cap B \\cap C\| ∣A∩B∩C∣是集合 A A A、 B B B和 C C C的交集的元素个数。 3. **n n n个集合的容斥原理**: 设 A 1 , A 2 , ... , A n A_1, A_2, \\ldots, A_n A1,A2,...,An是 n n n个集合,则它们的并集 A 1 ∪ A 2 ∪ ... ∪ A n A_1 \\cup A_2 \\cup \\ldots \\cup A_n A1∪A2∪...∪An的元素个数为: ∣ A 1 ∪ A 2 ∪ ... ∪ A n ∣ = ∑ i = 1 n ∣ A i ∣ − ∑ 1 ≤ i \< j ≤ n ∣ A i ∩ A j ∣ + ∑ 1 ≤ i \< j \< k ≤ n ∣ A i ∩ A j ∩ A k ∣ − ⋯ + ( − 1 ) n − 1 ∣ A 1 ∩ A 2 ∩ ... ∩ A n ∣ \|A_1 \\cup A_2 \\cup \\ldots \\cup A_n\| = \\sum_{i=1}\^{n} \|A_i\| - \\sum_{1 \\leq i \< j \\leq n} \|A_i \\cap A_j\| + \\sum_{1 \\leq i \< j \< k \\leq n} \|A_i \\cap A_j \\cap A_k\| - \\cdots + (-1)\^{n-1} \|A_1 \\cap A_2 \\cap \\ldots \\cap A_n\| ∣A1∪A2∪...∪An∣=∑i=1n∣Ai∣−∑1≤i\ #include #include #include using namespace std; typedef long long LL; const int N = 20; int p[N]; int n, m; 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 ++) { int t = 1, cnt = 0; for(int j = 0; j < m; j ++) { if(i >> j & 1) { if((LL)t * p[j] > n) { t = -1; break; } t *= p[j]; cnt ++; } } if(t == -1) continue; if(cnt % 2) res += n / t; else res -= n / t; } cout << res << endl; return 0; } ```

相关推荐
scdifsn2 小时前
动手学深度学习12.7. 参数服务器-笔记&练习(PyTorch)
pytorch·笔记·深度学习·分布式计算·数据并行·参数服务器
恰薯条的屑海鸥2 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
数据库·学习·安全·web安全·渗透测试·网络安全学习
int型码农2 小时前
数据结构第八章(一) 插入排序
c语言·数据结构·算法·排序算法·希尔排序
UFIT3 小时前
NoSQL之redis哨兵
java·前端·算法
喜欢吃燃面3 小时前
C++刷题:日期模拟(1)
c++·学习·算法
SHERlocked933 小时前
CPP 从 0 到 1 完成一个支持 future/promise 的 Windows 异步串口通信库
c++·算法·promise
怀旧,3 小时前
【数据结构】6. 时间与空间复杂度
java·数据结构·算法
积极向上的向日葵3 小时前
有效的括号题解
数据结构·算法·
GIS小天3 小时前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月7日第101弹
人工智能·算法·机器学习·彩票
_Itachi__3 小时前
LeetCode 热题 100 74. 搜索二维矩阵
算法·leetcode·矩阵