本文搬运自本人初中博客园博客,若图片加载不出来,可到原文查看:https://www.cnblogs.com/zhangtingxi/p/16531978.html
概念
下面除法皆表示整除
求:
i=1∑nin
显然,暴力 O(n),但有很多结果是相同的,所以可以分段每一段分别处理,大概有 n 段
令这一段的左端点(最小值)为 l,设 k=ln,我们要找一个最大值 r 满足 rn=k,显然 r=lnn,则 [l,r] 的和为 ln×(r−l+1)
数论分块
下面除法默认下取整
G(n,k)=i=1∑nkmodi=i=1∑n(k−ik×i)=n×k−i=1∑ni×ik
显然,对于 ik 必然是很多段连续的数组成,所以可以分块处理,也就是数论分块。
设当前这一块左端点为 l,结果为 a=lk,则 r=lk=lkk,前面乘 i 可以直接套等差数列求和公式。
时间复杂度 O(k)
以下分数皆表示整除
max(nmodi)=max(n−in×i)=n+max(−in×i)=n−min(in×i)
显然,当 in 一定时,i 越小越好,所以可以把每个 in 求出来,然后数列分块取最小值即可
显然,f(x) 就是 x 的因数个数。
设 S(n)=∑i=1nf(i),所以答案在求 S(r)−S(l−1)
对于任意 i∈[1,n],它作为小于等于 n 的数的约数个数为 in(向下取整),于是 S(n)=∑i=1nin
观察上式,S(n) 显然可以通过数论分块在 O(n) 的时间求出。
总时间复杂度 O(r)
显然数论分块
然后统计一下每一块内1到9出现的情况乘上 n/l 即可
设 n≤m
i=1∑n(nmodi)×j=1∑m(mmodj)−i=1∑n(nmodi)(mmodi)
前面那两坨就是个数论分块板子,后面那块拆一下:
i=1∑n(nm−im×in−in×im+im×in×i2)
这里还是可以数论分块,每次块的 r 可以取 min(lm,ln)
然后还有几个难点
-
后面那坨鬼东西乘 i2,众所周知二次方和公式 ∑i=1ni2=6n(n+1)(2n+1)
-
然后上面那个鬼公式因为上面三个乘起来会爆所以要用逆元
-
然后因为↑↓出题人模数不是质数不能用费马只能老老实实打拓欧