Solve problem 274
This commit is contained in:
@@ -0,0 +1,57 @@
|
|||||||
|
from math import gcd
|
||||||
|
from lib_prime import primes
|
||||||
|
from lib_misc import modinv
|
||||||
|
|
||||||
|
|
||||||
|
def find_m(p: int) -> int:
|
||||||
|
rs = []
|
||||||
|
test_n = p * 1337
|
||||||
|
for m in range(1, p):
|
||||||
|
test_f = f(test_n, m)
|
||||||
|
if test_f % p == 0:
|
||||||
|
rs.append(m)
|
||||||
|
assert len(rs) == 1
|
||||||
|
return rs[0]
|
||||||
|
|
||||||
|
|
||||||
|
def calc_m(p: int) -> int:
|
||||||
|
"""
|
||||||
|
(n // 10 + (n % 10) * m) % p == 0
|
||||||
|
a + b * m == 0 (mod p)
|
||||||
|
b * m == -a (mod p)
|
||||||
|
m == -a * b**-1 (mod p)
|
||||||
|
"""
|
||||||
|
n = p * 1337
|
||||||
|
a = n // 10
|
||||||
|
b = (n % 10)
|
||||||
|
m = -a * modinv(b, p)
|
||||||
|
m %= p
|
||||||
|
return m
|
||||||
|
|
||||||
|
|
||||||
|
def f(n: int, m: int = 34) -> int:
|
||||||
|
left = n // 10
|
||||||
|
right = n % 10 * m
|
||||||
|
r = left + right
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
def euler_274():
|
||||||
|
ps = primes(10**7)
|
||||||
|
sum_m = 0
|
||||||
|
for p in ps:
|
||||||
|
if gcd(p, 10) != 1:
|
||||||
|
continue
|
||||||
|
m = calc_m(p)
|
||||||
|
if p < 1000:
|
||||||
|
m_naiv = find_m(p)
|
||||||
|
assert m == m_naiv
|
||||||
|
sum_m += m
|
||||||
|
return sum_m
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
solution = euler_274()
|
||||||
|
print(f"e274.py: {solution}")
|
||||||
|
assert solution == 1601912348822
|
||||||
|
|
||||||
Reference in New Issue
Block a user