Project Euler 91

http://projecteuler.net/index.php?section=problems&id=91


点Pを軸上以外に取って、Pを通りOPに垂直に直線を引く。その直線上の格子点がQ。

f n = 3 * n * n + sum [ g (x,y) | x <- [1..n], y <- [1..n] ]
g (x,y) = (min (div x dx) (div (n - y) dy))
        + (min (div y dy) (div (n - x) dx)) where
        d = gcd x y
        dx = div y d
        dy = div x d

n = 50
main = print (f n)