Project Euler Problem 12
http://projecteuler.net/index.php?section=problems&id=12
501個以上の約数を持つ最初の三角数
main = print $ fst $ head $ filter (\x -> (snd x) > 500) (map (\n -> (n, factorsNumber n)) triangleNumbers) --約数チェックは平方根未満まで(ペアの約数があるので*2) factorsNumber :: Integer -> Integer factorsNumber n = (2::Integer) * (toInteger $ length [x | x <- [1..floor $ sqrt $ fromInteger n], n `mod` x == 0]) triangleNumbers :: [Integer] triangleNumbers = map (\n -> foldl1 (+) [1..n]) [1..]
三角数列の一般項を参考に11秒から5秒まで短縮
triangleNumbers :: [Integer] triangleNumbers = map (\n -> (n * (n+1)) `div` 2) [1..]