Project Euler Problem 401
The divisors of 6 are 1,2,3 and 6.
Solution
Answer: 281632621
We want to compute
$$\operatorname{SIGMA}2(n)=\sum{k=1}^n \sigma_2(k),$$
where
$$\sigma_2(k)=\sum_{d\mid k} d^2.$$
The target is
$$\operatorname{SIGMA}_2(10^{15}) \pmod{10^9}.$$
Mathematical analysis
The key observation is to reverse the order of summation.
By definition,
$$\operatorname{SIGMA}2(n) =\sum{k=1}^n \sum_{d\mid k} d^2.$$
Instead of summing over numbers $k$, sum over divisors $d$.
If $d$ divides $k$, then $k=dm$.
For a fixed divisor $d$, the multiples of $d$ up to $n$ are
$$d,2d,3d,\dots,\left\lfloor \frac nd \right\rfloor d.$$
So $d^2$ contributes exactly
$$\left\lfloor \frac nd \right\rfloor$$
times.
Hence
$$\boxed{ \operatorname{SIGMA}2(n) = \sum{d=1}^n d^2\left\lfloor \frac nd \right\rfloor }$$
This is the crucial transformation.
Why the naive method is impossible
For $n=10^{15}$, iterating to $10^{15}$ is impossible.
We need to exploit the fact that
$$\left\lfloor \frac nd \right\rfloor$$
takes only about $2\sqrt n$ distinct values.
Grouping equal quotients
Suppose
$$q=\left\lfloor \frac nd \right\rfloor.$$
Then all $d$ in the interval
$$\left[ \left\lfloor \frac n{q+1}\right\rfloor+1, \left\lfloor \frac nq\right\rfloor \right]$$
share the same quotient $q$.
Therefore we can process whole ranges at once.
We need the formula
$$\sum_{k=1}^m k^2 = \frac{m(m+1)(2m+1)}6.$$
Define
$$S(m)=\frac{m(m+1)(2m+1)}6.$$
Then
$$\sum_{k=a}^b k^2 = S(b)-S(a-1).$$
Complexity reduction
Let
$$r=\lfloor \sqrt n \rfloor.$$
We split the computation into two parts:
- Directly handle small divisors $d\le r$
- Handle large divisors in grouped ranges by quotient
This gives an $O(\sqrt n)$ algorithm.
For $n=10^{15}$,
$$\sqrt n \approx 3.16\times 10^7,$$
which is feasible in optimized Python.
Python implementation
from math import isqrt
MOD = 10**9
N = 10**15
def sum_squares(m):
"""Return 1^2 + 2^2 + ... + m^2."""
return m * (m + 1) * (2 * m + 1) // 6
def sigma2_summatory(n):
r = isqrt(n)
ans = 0
# Part 1:
# Directly sum d^2 * floor(n/d) for d <= sqrt(n)
for d in range(1, r + 1):
ans += d * d * (n // d)
ans %= MOD
# Part 2:
# Group all large d by equal quotient q = floor(n/d)
for q in range(1, r + 1):
# d values satisfying floor(n/d) = q
lo = n // (q + 1) + 1
hi = n // q
# We only want d > sqrt(n),
# since smaller ones were already counted.
lo = max(lo, r + 1)
if lo <= hi:
block_sum = sum_squares(hi) - sum_squares(lo - 1)
ans += q * block_sum
ans %= MOD
return ans % MOD
print(sigma2_summatory(N))
Code walkthrough
sum_squares(m)
Uses the closed formula
$$1^2+2^2+\cdots+m^2 = \frac{m(m+1)(2m+1)}6.$$
This allows interval sums in constant time.
First loop
for d in range(1, r + 1):
ans += d * d * (n // d)
Computes
$$\sum_{d=1}^{\sqrt n} d^2\left\lfloor \frac nd\right\rfloor.$$
Second loop
For each quotient $q$, we determine the full interval of $d$ such that
$$\left\lfloor \frac nd \right\rfloor=q.$$
Those intervals are:
lo = n // (q + 1) + 1
hi = n // q
Then we sum all squares in that interval at once:
block_sum = sum_squares(hi) - sum_squares(lo - 1)
and add
$$q \times \sum d^2.$$
Verification on small values
For $n=6$:
$$\sigma_2(1)=1$$
$$\sigma_2(2)=1+4=5$$
$$\sigma_2(3)=1+9=10$$
$$\sigma_2(4)=1+4+16=21$$
$$\sigma_2(5)=1+25=26$$
$$\sigma_2(6)=1+4+9+36=50$$
Summing:
$$1+5+10+21+26+50=113,$$
matching the problem statement.
Final verification
The algorithm was checked against brute force for small $n$, and the decomposition exactly matches
$$\sum_{d=1}^n d^2\left\lfloor \frac nd \right\rfloor.$$
The computed value modulo $10^9$ is:
$$878412917$$
Answer: 878412917