本文搬运自本人初中博客园博客,若图片加载不出来,可到原文查看:https://www.cnblogs.com/zhangtingxi/p/16531978.html

概念

下面除法皆表示整除

求:

∑i=1nni\sum_{i=1}^n \frac n i

显然,暴力 O(n)O(n),但有很多结果是相同的,所以可以分段每一段分别处理,大概有 n\sqrt n 段

令这一段的左端点(最小值)为 ll,设 k=nlk=\dfrac n l,我们要找一个最大值 rr 满足 nr=k\dfrac n r=k,显然 r=nnlr=\dfrac n{\frac n l},则 [l,r][l,r] 的和为 nl×(r−l+1)\dfrac n l\times (r-l+1)

例1 P2261 [CQOI2007]余数求和

数论分块

下面除法默认下取整

G(n,k)=∑i=1nk mod i=∑i=1n(k−ki×i)=n×k−∑i=1ni×ki\Large G(n, k)\\\Large = \sum_{i = 1}^n k \bmod i\\\Large=\sum_{i=1}^n(k-\frac k i\times i)\\\Large=n\times k-\sum_{i=1}^ni\times\frac k i

显然,对于 ki\frac k i 必然是很多段连续的数组成,所以可以分块处理,也就是数论分块。

设当前这一块左端点为 ll,结果为 a=kla=\dfrac k l,则 r=kl=kklr=\dfrac k l=\dfrac k {\frac k l},前面乘 ii 可以直接套等差数列求和公式。

时间复杂度 O(k)O(\sqrt k)

例2 牛客网235422 区间最大值

以下分数皆表示整除

max⁡(n mod i)=max⁡(n−ni×i)=n+max⁡(−ni×i)=n−min⁡(ni×i)\Large\max(n\bmod i)\\\Large=\max(n-\frac n i\times i)\\\Large=n+\max(-\frac n i\times i)\\\Large=n-\min(\frac n i \times i)

显然,当 ni\frac n i 一定时,ii 越小越好,所以可以把每个 ni\frac n i 求出来,然后数列分块取最小值即可

例3 P3935 Calculating

显然,f(x)f(x) 就是 xx 的因数个数。

设 S(n)=∑i=1nf(i)S(n)=\sum_{i=1}^nf(i),所以答案在求 S(r)−S(l−1)S(r)-S(l-1)

对于任意 i∈[1,n]i\in[1,n],它作为小于等于 nn 的数的约数个数为 ni\dfrac n i(向下取整),于是 S(n)=∑i=1nniS(n)=\sum_{i=1}^n \dfrac n i

观察上式,S(n)S(n) 显然可以通过数论分块在 O(n)O(\sqrt n) 的时间求出。

总时间复杂度 O(r)O(\sqrt r)

例4 牛客网NC13221数码

显然数论分块

然后统计一下每一块内1到9出现的情况乘上 n/ln/l 即可

例5 P2260 [清华集训2012]模积和

设 n≤mn\leq m

∑i=1n(n mod i)×∑j=1m(m mod j)−∑i=1n(n mod i)(m mod i)\Large\sum_{i=1}^{n} (n \bmod i) \times \sum_{j=1}^{m}(m \bmod j)-\sum_{i=1}^ n (n\bmod i)(m\bmod i)

前面那两坨就是个数论分块板子,后面那块拆一下:

∑i=1n(nm−mi×in−ni×im+mi×ni×i2)\Large \sum_{i=1}^n(nm-\frac m i\times in-\frac n i \times im+\frac m i\times\frac n i\times i^2)

这里还是可以数论分块,每次块的 rr 可以取 min⁡(ml,nl)\min(\dfrac m l, \dfrac n l)

然后还有几个难点

  1. 后面那坨鬼东西乘 i2i^2,众所周知二次方和公式 ∑i=1ni2=n(n+1)(2n+1)6\sum_{i=1}^n i^2=\dfrac {n(n+1)(2n+1)}6

  2. 然后上面那个鬼公式因为上面三个乘起来会爆所以要用逆元

  3. 然后因为↑↓出题人模数不是质数不能用费马只能老老实实打拓欧