## 引入 ???+ note "入门例题" 假设班里有 $10$ 个学生喜欢数学,$15$ 个学生喜欢语文,$21$ 个学生喜欢编程,班里至少喜欢一门学科的有多少个学生呢? 是 $10+15+21=46$ 个吗?不是的,因为有些学生可能同时喜欢数学和语文,或者语文和编程,甚至还有可能三者都喜欢. 为了叙述方便,我们把喜欢语文、数学、编程的学生集合分别用 $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\cup B\cup C|=|A|+|B|+|C|-|A\cap B|-|B\cap C|-|C\cap A|+|A\cap B\cap C| $$ ![容斥原理 - venn 图示例](./images/incexcp.svg) 把上述问题推广到一般情况,就是我们熟知的容斥原理. ## 定义 设 U 中元素有 n 种不同的属性,而第 i 种属性称为 $P_i$,拥有属性 $P_i$ 的元素构成集合 $S_i$,那么 $$ \begin{aligned} \left|\bigcup_{i=1}^{n}S_i\right|=&\sum_{i}|S_i|-\sum_{iN/2$ 时,我们可以直接算出 $f(k)= \lfloor (N/k) \rfloor ^2$,因此我们可以倒过来,从 $f(N)$ 算到 $f(1)$ 就可以了.于是,我们使用容斥原理完成了本题. ```cpp for (long long k = N; k >= 1; k--) { f[k] = (N / k) * (N / k); for (long long i = k + k; i <= N; i += k) f[k] -= f[i]; } ``` 上述方法的时间复杂度为 $O( \sum_{i=1}^{N} N/i)=O(N \sum_{i=1}^{N} 1/i)=O(N \log N)$. 附赠三倍经验供大家练手. - [Luogu P2398 GCD SUM](https://www.luogu.com.cn/problem/P2398) - [Luogu P2158\[SDOI2008\] 仪仗队](https://www.luogu.com.cn/problem/P2158) - [Luogu P1447\[NOI2010\] 能量采集](https://www.luogu.com.cn/problem/P1447) ### 容斥原理推导欧拉函数 考虑下面的问题: ???+ note "欧拉函数公式" 求欧拉函数 $\varphi(n)$.其中 $\varphi(n)=|\{1\leq x\leq n|\gcd(x,n)=1\}|$. 直接计算是 $O(n\log n)$ 的,用线性筛是 $O(n)$ 的,杜教筛是 $O(n^{\frac{2}{3}})$ 的(话说一道数论入门题用容斥做为什么还要扯到杜教筛上),接下来考虑用容斥推出欧拉函数的公式 判断两个数是否互质,首先分解质因数 $$ n=\prod_{i=1}^k{p_i}^{c_i} $$ 那么就要求对于任意 $p_i$,$x$ 都不是 $p_i$ 的倍数,即 $p_i\nmid x$. 把它当作属性,对应的集合为 $S_i$,因此有 $$ \varphi(n)=\left|\bigcap_{i=1}^kS_i\right|=|U|-\left|\bigcup_{i=1}^k\overline{S_i}\right| $$ 全集大小 $|U|=n$,而 $\overline{S_i}$ 表示的是 $p_i\mid x$ 构成的集合,显然 $|\overline{S_i}|=\frac{n}{p_i}$,并由此推出 $$ \left|\bigcap_{a_i