Files
euler/python/e684.py

55 lines
1.1 KiB
Python

def r_modulo_closed_form(n, m):
# From e132.py
assert n > 0 and m > 0
return ((pow(10, n, 9 * m) - 1) // 9) % m
def s(n, mod):
a = n % 9
b = n // 9
r = (a + 1) * pow(10, b, mod) - 1
return r % mod
def s_big(n, mod):
# s = (n % 9 + 1) * 10^(n/9) - 1
# S = sum(k=0, n/9) (1 * 10^k + 2 * 10^k + ... + 9 * 10^k) - n
# = 45 * sum(k=0, n/9) 10^k - n
# = 45 * r(n/9) - n
# Plus some extra math to make n % 9 == 8 so that the above works.
r = -1
while n % 9 != 8:
n += 1
r -= s(n, mod)
r += (r_modulo_closed_form(n // 9 + 1, mod) * 45) % mod
r -= n
return r % mod
def s_big_naiv(n, mod):
r = 0
for i in range(1, n + 1):
r += s(i, mod)
if mod is not None:
r %= mod
return r
def euler_684():
assert s_big_naiv(20, 11) == s_big(20, 11)
r = 0
mod = 1_000_000_007
a, b = 0, 1
for _ in range(2, 91):
a, b = b, a + b
r += s_big(b, mod)
return r % mod
if __name__ == "__main__":
solution = euler_684()
print("e684.py: " + str(solution))
assert(solution == 922058210)