55 lines
1.1 KiB
Python
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)
|