75問目
http://projecteuler.net/index.php?section=problems&id=75
周の長さが 120 の直角三角形は (30,40,50), (20,48,52), (24,45,51) の3つを作ることができる。周の長さを L としたとき、直角三角形が1つだけ作れるような L は L ≦ 2000000 にいくつ存在するか。
ピタゴラス数を生成する式から、題意を満たすものを抽出しています。
import Data.List main = print $ euler075 2000000 euler075 :: Integer -> Int euler075 m = length $ filter ((== 1) . length) $ group $ sort [ d*l | l <- filter (<= m) (rightAngles r), d <- [1..(div m l)] ] where r = floor $ sqrt $ fromIntegral m rightAngles :: Integer -> [Integer] rightAngles mm = [ 2*m*(m+n) | m <- [1..mm], n <- [1..m-1], gcd m n == 1, mod m 2 /= mod n 2]