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

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

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

相关推荐
wdfk_prog15 分钟前
[Linux]学习笔记系列 -- 内核支持与数据
linux·笔记·学习
im_AMBER20 分钟前
Leetcode 102 反转链表
数据结构·c++·学习·算法·leetcode·链表
箫笙默26 分钟前
Vue3基础笔记
笔记·vue·vue3
今儿敲了吗40 分钟前
01|多项式输出
c++·笔记·算法
朔北之忘 Clancy1 小时前
2025 年 9 月青少年软编等考 C 语言一级真题解析
c语言·开发语言·c++·学习·数学·青少年编程·题解
Xの哲學1 小时前
深入剖析Linux文件系统数据结构实现机制
linux·运维·网络·数据结构·算法
AlenTech1 小时前
200. 岛屿数量 - 力扣(LeetCode)
算法·leetcode·职场和发展
C雨后彩虹1 小时前
竖直四子棋
java·数据结构·算法·华为·面试
wxr06161 小时前
GIT学习
git·学习
oraen2 小时前
【AI学习-2.1】部署自己的本地大模型 -本地推理
学习