Solve problem 401
This commit is contained in:
@@ -0,0 +1,78 @@
|
|||||||
|
def divisors(n: int) -> list[int]:
|
||||||
|
xs = set()
|
||||||
|
d = 1
|
||||||
|
while d * d <= n:
|
||||||
|
if n % d == 0:
|
||||||
|
xs.add(d)
|
||||||
|
xs.add(n // d)
|
||||||
|
d += 1
|
||||||
|
return sorted(list(xs))
|
||||||
|
|
||||||
|
|
||||||
|
def sigma2(n: int) -> int:
|
||||||
|
return sum(d**2 for d in divisors(n))
|
||||||
|
|
||||||
|
|
||||||
|
def sum2(a: int, b: int) -> int:
|
||||||
|
return sum(x**2 for x in range(a, b + 1))
|
||||||
|
|
||||||
|
|
||||||
|
def sigma2caps_naive(n: int) -> int:
|
||||||
|
return sum(sigma2(i) for i in range(1, n + 1))
|
||||||
|
|
||||||
|
|
||||||
|
def sum2(a: int, b: int) -> int:
|
||||||
|
# Calculate sum(x**2 for x in range(a, b + 1)) directly
|
||||||
|
# https://stackoverflow.com/questions/70902823/
|
||||||
|
r = b * (b + 1) * (2 * b + 1)
|
||||||
|
r -= (a - 1) * a * (2 * (a - 1) + 1)
|
||||||
|
r //= 6
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
def binsearch(a: int, d: int, n: int) -> int:
|
||||||
|
# Return the largest integer i in [a, n] for which n // i == d.
|
||||||
|
|
||||||
|
# Naive:
|
||||||
|
# b = a
|
||||||
|
# while n // (b + 1) == d:
|
||||||
|
# b += 1
|
||||||
|
# return b
|
||||||
|
|
||||||
|
b = n
|
||||||
|
while n // b != d:
|
||||||
|
mid = (a + b) // 2
|
||||||
|
if b // mid != d:
|
||||||
|
b = mid
|
||||||
|
else:
|
||||||
|
a = mid
|
||||||
|
return b
|
||||||
|
|
||||||
|
|
||||||
|
def sigma2caps(n: int) -> int:
|
||||||
|
res = 0
|
||||||
|
mod = 10**9
|
||||||
|
a = 1
|
||||||
|
while a <= n:
|
||||||
|
d = n // a
|
||||||
|
b = binsearch(a, d, n)
|
||||||
|
s2 = sum2(a, b) % mod
|
||||||
|
res += (s2 * d) % mod
|
||||||
|
res %= mod
|
||||||
|
a = b + 1
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
def euler_401():
|
||||||
|
assert sum2(23, 1337) == sum(x**2 for x in range(23, 1337 + 1))
|
||||||
|
assert sigma2caps_naive(6) == 113
|
||||||
|
assert sigma2caps(6) == 113
|
||||||
|
assert sigma2caps(10**6) == 385965077
|
||||||
|
assert sigma2caps(10**9) == 73475174
|
||||||
|
return sigma2caps(10**15)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
solution = euler_401()
|
||||||
|
print(f"e401.py: {solution}")
|
||||||
|
assert solution == 281632621
|
||||||
@@ -8,7 +8,7 @@ def euler_XXX():
|
|||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
solution = euler_XXX()
|
solution = euler_XXX()
|
||||||
print(f"eXXX.py: {solution}")
|
print(f"eXXX.py: {solution}")
|
||||||
# assert(solution == 0)
|
# assert solution == 0
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user