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

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

@@ 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; } ```

相关推荐
And_Ii10 小时前
LeetCode 3397. 执行操作后不同元素的最大数量
数据结构·算法·leetcode
。TAT。10 小时前
C++ - List
数据结构·c++·学习
额呃呃10 小时前
leetCode第33题
数据结构·算法·leetcode
隐语SecretFlow10 小时前
【隐语SecretFlow用户案例】亚信科技构建统一隐私计算框架探索实践
科技·算法·安全·隐私计算·隐私求交·开源隐私计算
dragoooon3410 小时前
[优选算法专题四.前缀和——NO.27 寻找数组的中心下标]
数据结构·算法·leetcode
少许极端10 小时前
算法奇妙屋(七)-字符串操作
java·开发语言·数据结构·算法·字符串操作
小龙报11 小时前
《算法通关指南---C++编程篇(2)》
c语言·开发语言·数据结构·c++·程序人生·算法·学习方法
金宗汉11 小时前
《宇宙递归拓扑学:基于自指性与拓扑流形的无限逼近模型》
大数据·人工智能·笔记·算法·观察者模式
张永清-老清11 小时前
每周读书与学习->JMeter主要元件详细介绍(一)配置元件
学习·jmeter·性能调优·jmeter性能测试·性能分析·干货分享
狮智先生12 小时前
【学习笔记】利用meshlab进行曲面的质量检查
经验分享·笔记·课程设计·几何学