整数分块
现在来补一下小知识
例子
求上式。
考虑先打个表,方便理解。令 ,则:
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
10 | 5 | 3 | 2 | 2 | 1 | 1 | 1 | 1 | 1 |
我们可以发现对于 递增时, 呈不上升,可以直接数学证明。
那么我们对于 相同的连续区间作为一个块,将序列进行分块。
令 是一个块,那么我们可以发现对于 ,都有 。
现在考虑如何使用这个性质把分块进行扩展。
此时发现当 时,,我们知道 的代数值后,则 。
所以,初始化 ,再把 进行扩展,发现块与块之间的转移 。
时间复杂度从 简化到了 。
放一份模板题的核心代码:(洛谷-P2261 [CQOI2007]余数求和)
for(lint l=1,r=1;l<=n;(l=r)++)
{
r=((k/l) ? min(k/(k/l),n) : n);
ans-=((l+r)*(r-l+1)/2)*(k/l);
}