📌  相关文章
📜  位于[L,R]范围内的所有完善数的总和(1)

📅  最后修改于: 2023-12-03 15:06:42.189000             🧑  作者: Mango

求解位于 [L, R] 范围内的所有完美数总和

完美数是一种特殊的数字,它等于其所有的因数(除自己外)之和。例如,6是第一个完美数,因为6 = 1 + 2 + 3。

现在给定一个区间 [L, R],请你计算出该区间内所有完美数的总和。

解法一:暴力枚举

最简单粗暴的方法就是直接枚举区间内的每个数,然后判断其是否为完美数,如果是,则加入结果中。

判断一个数是否为完美数的方法非常简单,只需要枚举其因数,然后将因数累加起来,看是否等于该数本身即可。

时间复杂度:$O((R-L)\sqrt{R})$

细节处理:

  • 界限$L$和$R$可能非常大,需要使用$long\ long$类型存储结果。
  • 对于每个数字,需要做完整的因数枚举,这个过程需要注意重复计算,即当我们找到一对因数时,同时将其余数也加入结果中是不合理的。
解法二:欧拉筛法

欧拉提出了一种非常强大的质数筛法——欧拉筛法,它不仅可以判断质数,还可以判断完美数。

欧拉筛法的基本思想是:将筛掉的数标记为它的最小质因数,这样对于任意一个合数,都能被它的最小质因数筛掉。

接下来,我们需要证明一个定理:

如果一个数N能够用若干个质数的积来表示,那么这个乘积中,每个质数的指数必须不大于2。

证明:

假设一个数N能够用若干个质数的积来表示,其中某个质数的指数等于3,则这个数可以写成$N=p^{3}a$,其中$p$是质因子,$a$是$p$以外的质因子。我们可以根据这个式子构造出一个因数对:$(p^2, pa)$,这两个数都是$N$的因数,它们之和为$N+p^2a<N+p^3a=2N$,因此$N$不是完美数。

根据上述定理,我们知道,如果一个数$N$是完美数,那么它的所有质因子的指数必须是1或2。根据这个性质,我们可以预处理出所有小于等于$\sqrt{R}$的质数并记录它们的平方和。由于完全数都是偶数,因此这样可以省掉一半的计算量。

接下来,我们需要使用欧拉筛法,逐个遍历大于$\sqrt{R}$的数。对于每个数,我们可以将其分解质因数,然后计算出其所有因子的和。如果这个和等于该数的2倍,则说明该数为完美数,将其加入结果中。

时间复杂度:$O(\sqrt{R}\log\log{R}+(R-L)\sqrt{R})$

细节处理:

  • 在欧拉筛法中,对于每个数,我们需要记录下标记它的质因数,以便后续计算因子和。这里,我们可以使用另外一个数组$f$来存储,当$f[i]=0$时,表示$i$是质数,当$f[i]=p$时,表示$i$的最小质因数为$p$。
解法三:优化欧拉筛法

在上述解法中,我们使用欧拉筛法来预处理质数和计算因子和,但是实际上这个过程可以优化。

根据第一个定理,我们知道完美数的所有质因子指数必须是1或2,也就是说,我们只需要枚举完全平方数的因子即可。例如,如果我们知道一个数$x$是完全平方数,它可以表示为$p^2$,那么它的因子有$p^0=1$和$p^1=p$两个,我们只需要计算这两个数对结果的贡献,其他因子的贡献都可以通过这两个相乘得到。

因此,我们只需要预处理出$[1, \sqrt{R}]$区间内的完全平方数,然后计算它们的贡献即可。

时间复杂度:$O(\sqrt{R}+\frac{R-L}{\sqrt{R}})$

细节处理:

  • 在预处理完全平方数时,我们需要注意,当一个数是完全平方数时,它只能被计算一次。因此,我们可以使用一个$vis$数组来记录。
总结

对于该问题,我们可以采用暴力枚举、欧拉筛法以及优化欧拉筛法三种方法来求解。其中,暴力枚举较为简单,但时间复杂度较高;欧拉筛法可以通过加速预处理过程来优化,但代码较为复杂;优化欧拉筛法虽然实现相对简单,但容易出错。针对不同场景,我们可以选择不同的算法,达到更好的效果。