Life Goes On

まあまあだけど楽しんでる方です

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]