整数分块
比如:
$$
\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor
$$
$O(n)$的做法之外,还有一种$O(\sqrt{n})$的做法。
对于每个$\lfloor\frac{n}{i}\rfloor$我们可以通过打表发现有许多的值是不断重复的,再继续寻找规律(不会找啊Orz)发现每一块的数字都是n/(n/i),那么就可以利用分块的道理:
1 | for(int l=1,r;l<=n;l=r+1) |
有时候可能推出来的式子没有这么裸,它可能乘了一个积性函数$\mu,\varphi $,这时候就要对这些函数统计一个前缀和,因为当我们跳过一个分块的时候,就相当于跳过了这个块的函数值。
P.S. 当$O(n)$也T,杜教筛????????????
莫比乌斯函数μ(d)
定义:
- d = 1时,μ(d) = 1;
- d = $\Pi_{i=1}^{k}p_i $ ,pi为互不相同的素数时,$μ(d) =(-1)^k$(也就是说,当用于乘积的某一个质因子的次数不大于1时,μ值由用于乘积的质因子个数决定);
- 其他情况,都为0 。
性质:
- $\sum_{d|n}μ(d) = (n=1)$
- $\sum_{d|n}\frac{μ(d)}{d} = \frac{φ(n)}{n}$,其中φ为小于n与n互质的数字的个数
1 | /** 对于μ函数的线筛 */ |
有时候要同时求φ(x)和μ(x),整合版:
1 | /*mu为μ,phi为φ */ |
莫比乌斯反演
定理:F(n)和f(n)是定义在非负整数集合上的两个函数,并且满足条件:
$$
F(n)=\sum_{d|n}f(d)
$$
那么参考容斥的话,就能推出:
$$
f(n)=\sum_{d|n}μ(d)F(\frac{n}{d})
$$
一个更好用的形式,当满足:
$$
F(n)=\sum_{n|d}f(d)
$$
有:
$$
f(n)=\sum_{n|d}μ(\frac{d}{n})F(d)
$$