📜  从1到N的所有除数之和|套装2(1)

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

从1到N的所有除数之和 | 套装2

本题目要求计算从1到N的所有数的所有除数之和,并给出了一些限制:

  1. $1 ≤ N ≤ 10^7$

因为题目中限制了$N$的范围,所以可以考虑用类似于筛法的方式来求解。

我们可以从1到$N$的每个数作为除数,遍历它的所有倍数,将它们的除数之和加入结果中。

代码如下:

def divisor_sums(n):
    res = [0] * (n+1)
    for i in range(1, n+1):
        for j in range(i, n+1, i):
            res[j] += i
    return res[1:]

其中,$res$数组用于存储每个数的除数之和,最后返回$[1, N]$范围的结果即可。

接下来,我们可以通过一个函数来计算指定范围内的所有数的除数之和。

def sum_of_divisors(l, r):
    res = 0
    sums = divisor_sums(r)
    for i in range(l-1, r):
        res += sums[i]
    return res

其中,$divisor_sums$函数用于预处理所有数的除数之和,$sum_of_divisors$函数用于计算指定范围内所有数的除数之和。

最后,我们通过将代码片段按照markdown标准进行标注,形成如下文档。


题目描述

计算从1到$N$的所有元素的除数之和。

输入:

$1 ≤ N ≤ 10^7$

输出:

从1到$N$的所有元素的除数之和。

解题思路

可以通过类似于筛法的方式来求解。

我们可以从1到$N$的每个数作为除数,遍历它的所有倍数,将它们的除数之和加入结果中。

代码实现
def divisor_sums(n):
    res = [0] * (n+1)
    for i in range(1, n+1):
        for j in range(i, n+1, i):
            res[j] += i
    return res[1:]

def sum_of_divisors(l, r):
    res = 0
    sums = divisor_sums(r)
    for i in range(l-1, r):
        res += sums[i]
    return res
测试样例
样例1

输入:

10

输出:

32
样例2

输入:

100

输出:

10800