P2424 约数和 && 真丶除法分块

P2424 约数和

题目背景
Smart最近沉迷于对约数的研究中。

题目描述
对于一个数X,函数f(X)表示X所有约数的和。例如:f(6)=1+2+3+6=12。对于一个X,Smart可以很快的算出f(X)。现在的问题是,给定两个正整数X,Y(X<Y),Smart希望尽快地算出f(X)+f(X+1)+……+f(Y)的值,你能帮助Smart算出这个值吗?

输入输出格式
输入格式:
输入文件仅一行,两个正整数X和Y(X<Y),表示需要计算f(X)+f(X+1)+……+f(Y)。

输出格式:
输出只有一行,为f(X)+f(X+1)+……+f(Y)的值。

Solution

首先利用前缀和的思想, 我们只要能求出 \(1 - n\) 的约数和的和, 就能求出一段区间的约数和的和
那么如何快速求出从 \(1\) 开始约数和的和呢
很朴素大暴力万岁!的算法是 \(O(\sqrt{n})\) 计算每个数的约数进行累加 ,然后慢到爆炸

我们可以换种思维, 考虑枚举约数
显然对于一个约数 \(d\) , 在 \(1 - n\) 中出现过 \(\lfloor \frac{n}{d}\rfloor\) 次, 所以这一约数贡献的答案为 \(\lfloor \frac{n}{d}\rfloor * d\)
所以 \(1-n\) 总因数和为 \[\sum_{i = 1}^{n}\lfloor \frac{n}{i}\rfloor * i\]
这样依然需要枚举 \(1-n\)\(n\) 个因数, \(O(n)\) 依然达不到复杂度要求

其实看到 \(\lfloor \frac{n}{d}\rfloor\) 时我们很兴奋: 除法分块!
(之前学的除法分块是假的。。现在补个真的)
比如说当 \(n = 12\) 时, 我们分别计算 \(\lfloor\frac{n}{i}\rfloor\ (1 <= i <= 12)\) 可以得到以下结果:
\(12,6,4,3,2,2,1,1,1,1,1,1\)
注意有部分连续的向下取整值是一样的!除法分块就是 利用打表找规律 来求出每个区间的左右端点以达到进行快速运算的目的

猜你喜欢

转载自www.cnblogs.com/Tony-Double-Sky/p/9490077.html