main
黄海 2 years ago
parent 9be3b2170c
commit 45fd2a5fef

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

Loading…
Cancel
Save