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