0439 约数之和和
* * * *
拉格朗日计划
* * * *
约数之和和

令$d(k)$为k的所有约数之和,再令$S(N)=\sum_{i,j=1}^Nd(ij)$,例如$S(3)=d(1)+d(2)+d(3)+d(2)+d(4)+d(6)+d(3)+d(6)+d(9)=59$。

可以验证$S(10^3)=563576517282$以及$S(10^5) \bmod 10^9=215766508$。

求$S(10^{11}) \bmod 10^9$。

本题难度:



解答

本题似乎直接用以下公式求和最为简洁 $$S(n)=\sum_{d=1}^{N^2}d\sum_{x=1}^N\lfloor\frac{N}{\gcd(x,d)}\rfloor,$$ 以下改编自官方论坛,最终结果为$968697378$。

注:因使用cache装饰器作记忆化搜索,以下代码为Python 3。代码需要数小时运行,且递归实现难以打印进度,需耐心等待。

from functools import *

N=10**11
mod=10**9

f=lambda x: x*(x+1)//2

@cache
def S(x):
    a=b=0
    u=1
    while u <= x:
        y=x//u
        v=x//y
        a+=y*(f(v)-f(u-1))
        b+=f(y)*(v-u+1)
        u=v+1
    r=a*b
    u=2
    while u <= x:
        y=x//u
        v=x//y
        r-=S(y)*(f(v)-f(u-1))
        u=v+1
    return r

print(S(N)%mod)