求\(\sum\limits_{i=1}^n{k\;mod\;i}\)
显然就是\(nk-\sum\limits_{i=1}^n{i\times\left\lfloor{\dfrac{k}{i}}\right\rfloor}\)
那么问题就在于后面这个\(\sum\),它是要用整除分块去做,可以在\(O(\sqrt k)\)完成
那么看看这个怎么求就行了:\(\sum\limits_{i=1}^n{\left\lfloor{\dfrac{n}{i}}\right\rfloor}\)
显然(打表可知)对于某段连续的\(i\),\(\left\lfloor{\dfrac{n}{i}}\right\rfloor\)的值是相同的
并且相同的段是区间\(\left[l, \dfrac{n}{\left\lfloor\dfrac{n}{l}\right\rfloor}\right]\),对应的数是\(\left\lfloor\dfrac{n}{l}\right\rfloor\)
那么下面这个问题的代码如下
for(int l = 1, r;l <= n;l = r + 1)
{
r = n / (n / l);
ans += (n / l) * (r - l + 1);
}
同样的,上面这个问题我们也就会了,只是加了一个等差数列而已
ans = n * k;
for(int l = 1, r;l <= n;l = r + 1)
{
r = (k / l) ? (k / (k / l)) : n;
ans -= (k / l) * (l + r) * (r - l + 1) / 2;
}