https://projecteuler.net/problem=91
直角がどの点か決めて、Qが直角ならQPがOQに直交するようにPを定めます。
速くなりそうな気もしますが、難しいですね。
from math import sqrt import sys #################### library #################### fn gcd(n: Int, m: Int) -> Int: if m == 0: return n else: return gcd(m, n % m) #################### process #################### fn f(L: Int) -> Int: var num_triangles = L * L # 原点が直角 num_triangles += L * L * 2 # Qx = 0 or Qy = 0 for Qx in range(1, L+1): for Qy in range(1, L+1): var d = gcd(Qx, Qy) var vx = -Qy // d var vy = Qx // d num_triangles += min(Qx // (-vx), (L-Qy) // vy) num_triangles += min((L-Qx) // (-vx), Qy // vy) return num_triangles fn main() raises: var args = sys.argv() var L = atol(args[1]) print(f(L))