https://projecteuler.net/problem=94
二等辺三角形なので、直角三角形を二つ合わせたものです。なので、その直角三角形を
とすると、
か
となります。どちらでもとなって、前者は、
で、4の剰余を考えると、
しかないです。これはPell方程式です。また後者なら、
ですが、これは、
で、これもPell方程式です。
import sys #################### process #################### fn next_solution(z: Tuple[Int, Int]) -> Tuple[Int, Int]: var x = z.get[0, Int]() var y = z.get[1, Int]() return (2*x + 3*y, x + 2*y) # m^2 - 3n^2 = 1 fn f1(N: Int) -> Int: var sum_p = 0 var z = (2, 1) while True: var m = z.get[0, Int]() var n = z.get[1, Int]() var p = 4*m*m if p > N: break sum_p += p z = next_solution(z) return sum_p # m^2 + n^2 - 4mn = 1 fn f2(N: Int) -> Int: var sum_p = 0 var z = (7, 4) while True: var x = z.get[0, Int]() var m = z.get[1, Int]() var n = 2*m-x var p = 2*(m+n)**2 if p > N: break sum_p += p z = next_solution(z) return sum_p fn f(E: Int) -> Int: var N = 10**E return f1(N) + f2(N) fn main() raises: var args = sys.argv() var E = atol(args[1]) print(f(E))