本文搬运自本人初中博客园博客,若图片加载不出来,可到原文查看: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×(rl+1)\dfrac n l\times (r-l+1)

例1 P2261 [CQOI2007]余数求和

数论分块

下面除法默认下取整

G(n,k)=i=1nkmodi=i=1n(kki×i)=n×ki=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(nmodi)=max(nni×i)=n+max(ni×i)=nmin(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(l1)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]模积和

nmn\leq m

i=1n(nmodi)×j=1m(mmodj)i=1n(nmodi)(mmodi)\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(nmmi×inni×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. 然后因为↑↓出题人模数不是质数不能用费马只能老老实实打拓欧