https://www.cnblogs.com/chenxiaoran666/p/divide.html //大神勃客
我们用样例来打表找规律,发现 $\lfloor \frac{k}{i} \rfloor $分别在一定的区域内相等,如下表所示:
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
\(\lfloor \frac{k}{i} \rfloor\) | 5 | 2 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
可见 \(\lfloor \frac{k}{i} \rfloor\) 分成了 3 块,我们只需要计算 \(n×k\) 减去每一块的和即可
通过打表不难发现 \(\lfloor \frac{k}{i} \rfloor\)最多有\(2*\sqrt{k}\)种取值
当\(\lfloor\frac ni\rfloor=\lfloor\frac n{i'}\rfloor\),i′的最大取值为\(\lfloor\frac n{\lfloor\frac ni\rfloor}\rfloor\)
根据上个结论,首先枚举块的左边界 l,并根据左边界和 k 计算出右边界 r
令\(t = \lfloor \frac{k}{l} \rfloor\),分两种情况讨论:
-
\(t \neq 0\),则 \(r = \min (\lfloor \frac{k}{t} \rfloor , n)\);
-
\(t=0\),则$ r=n。$
-
在[k/3]+1到[k/2]这个区间里,k%i也是一个等差数列,公差为2
在[k/4]+1到[k/3]这个区间里,k%i也是一个等差数列,公差为3
.........
一直到[k/√k]+1到[k/(√k-1)]这个区间里,k%i也是一个等差数列,公差为(√k-1).
剩下的1到[k/√k]的区间直接暴力求解即可.
这样,我们就能用O(√k)来解决了.
根据容斥原理
来源:oschina
链接:https://my.oschina.net/u/4305379/blog/4366475