|
|
|
@ -90,32 +90,42 @@ void get_mobius(int n) {
|
|
|
|
|
|
|
|
|
|
**题解**
|
|
|
|
|
|
|
|
|
|
考虑在$[1, n]$ 中,有多少个数是$x^2$的倍数? 显然是$⌊\frac{n}{x^2}⌋$个。
|
|
|
|
|
先来求一下 **平方数因数** 的数有多少个:
|
|
|
|
|
|
|
|
|
|
在$[1, n]$ 中,有多少个数是$x^2$的倍数? 显然是$⌊\frac{n}{x^2}⌋$个。
|
|
|
|
|
|
|
|
|
|
那 $⌊\frac{n}{x^2}⌋$ 就是答案了吗?当然不是,有大量的数被重复计算了。
|
|
|
|
|
|
|
|
|
|
例如 $36$,它等于$2^2\times 3^2$ ,在枚举 $2$ 和 $3$ 的时候它就会被重复计算。
|
|
|
|
|
例如 $36$,它等于$2^2\times 3^2$ ,在计算 $2$ 和 $3$ 的时候它会被重复计算。
|
|
|
|
|
|
|
|
|
|
怎么办呢?加加减减弄对呗!
|
|
|
|
|
怎么办呢?
|
|
|
|
|
|
|
|
|
|
利用容斥的思想,$1$到$n$以内有平方因数的数有$\large \frac{n}{2^2}+\frac{n}{3^2}+\frac{n}{5^2}-\frac{n}{6^2}...$。
|
|
|
|
|
> **注**:为什么没有$4^2$呢?这是因为$4^2=2^2 \times 2^2$,在计算$2^2$的个数时,已经计算过了,同理,合数都可以拆分成质数的乘积,我们只要计算质数就可以了。
|
|
|
|
|
但是,$6^2=2^2\times 3^2$这样的数字比较特殊,它会被在计算$2^2$时计算一遍,在计算$3^2$时又计算了一遍,计算重复了,需要再扣除掉$\frac{n}{6^2}$个,这就是容斥原理。
|
|
|
|
|
利用容斥思想,$1$到$n$以内有平方因数的数有$\large \frac{n}{2^2}+\frac{n}{3^2}+\frac{n}{5^2}-\frac{n}{6^2}...$。
|
|
|
|
|
> **注**:
|
|
|
|
|
> ① 为什么没有$4^2,8^2$呢?这是因为$4^2=4 \times 2^2,8^2=16\times 2^2$,在计算$2^2$的个数时,已经计算过了,同理,合数都可以拆分成质数的乘积,我们只要计算质数的平方就可以了。
|
|
|
|
|
② 但是 $6^2=2^2\times 3^2$这样的数字比较特殊,它会被在计算$2^2$时计算一遍,在计算$3^2$时又计算了一遍,计算重复了,需要再扣除掉$\frac{n}{6^2}$个,这里可以看出来符合容斥原理。
|
|
|
|
|
|
|
|
|
|
**$Q$:即然这是容斥原理,那和莫比乌斯函数有什么关系呢?**
|
|
|
|
|
答:你从现实意义上去看看:
|
|
|
|
|
**$Q$:即然这是容斥原理,和莫比乌斯函数有什么关系?**
|
|
|
|
|
答:从现实意义上去看看:
|
|
|
|
|
- $2,3,5$都是一个质数因子,它的系数是$1$
|
|
|
|
|
- $6$有两个质数因子,系数就是$-1$,
|
|
|
|
|
- $4=2^2$,按莫比乌斯函数的说法,系数为$0$,无贡献
|
|
|
|
|
- $6 = 2 \times 3$,有两个质数因子,系数是$-1$
|
|
|
|
|
|
|
|
|
|
这不就是莫比乌斯函数的定义吗?
|
|
|
|
|
|
|
|
|
|
可知以上式子 $\displaystyle =-\sum_{2 \leq d \leq \sqrt{n}} \mu(d)*(n/d^2)$
|
|
|
|
|
所以无平方因数的数就是求补集=$\displaystyle n-(-\sum_{2 \leq d \leq \sqrt{n}} \mu(d)*(n/d^2))=n+\sum_{2 \leq d \leq \sqrt{n}} \mu(d)*(n/d^2)$个。
|
|
|
|
|
可知以上式子 $\displaystyle =-\sum_{2 \leq d \leq \sqrt{n}} \mu(d)*⌊\frac{n}{d^2}⌋$
|
|
|
|
|
> **注**:为什么只枚举到$\sqrt{n}$,而不是到$n$呢?这是因为:$d>\sqrt{n}$时,$⌊\frac{n}{d^2}⌋$恒等于$0$,再继续也是无贡献,只需要枚举到$\sqrt{n}$即可。
|
|
|
|
|
|
|
|
|
|
变形合并,$d=1,\mu(d)=\mu(1)=1,n/d^2=n/1=n$,发现这个式子可以合并成$\displaystyle \sum_{1 \leq d \leq \sqrt{n}} \mu(d)*(n/d^2)$
|
|
|
|
|
所以无平方因数的数就是 **求补集**=$\displaystyle n-(-\sum_{2 \leq d \leq \sqrt{n}} \mu(d)*⌊\frac{n}{d^2}⌋)=n+\sum_{2 \leq d \leq \sqrt{n}} \mu(d)*⌊\frac{n}{d^2}⌋$个。
|
|
|
|
|
|
|
|
|
|
变形合并,$d=1,\mu(d)=1$(莫比乌斯的分段函数求得)
|
|
|
|
|
$\mu(d)*⌊\frac{n}{d^2}⌋=\mu(1)*(n/1^2)=1*n=n$
|
|
|
|
|
|
|
|
|
|
此时可以发现这个式子,第一项也可以合并进来,合并成
|
|
|
|
|
$$\displaystyle \sum_{1 \leq d \leq \sqrt{n}} \mu(d)*⌊\frac{n}{d^2}⌋$$
|
|
|
|
|
|
|
|
|
|
$⌊\frac{n}{d^2}⌋$是整除分块的基本形式,用整除分块优化,区间的数值都是一样的,但每项的符号有加有减,一个个算太慢了,可以给$μ(x)$预处理出前缀和,这样直接用$O(1)$时间计算前缀和,再乘上整除分块的数值就行了~
|
|
|
|
|
|
|
|
|
|
$⌊\frac{n}{d^2}⌋$是整除分块的基本形式,用整除分块优化,这样区间的数值都是一样的,但符号有加有减,一个个算太慢了,可以给$μ(x)$预处理出前缀和,这样直接用$O(1)$时间计算前缀和,再乘上整除分块的数值就行了~
|
|
|
|
|
> **注**:
|
|
|
|
|
> $d>\sqrt{n}$时,$⌊\frac{n}{d^2}⌋$恒等于$0$,只需要枚举到$\sqrt{n}$即可。
|
|
|
|
|
|
|
|
|
|
#### $Code$
|
|
|
|
|
```cpp {.line-numbers}
|
|
|
|
|