85問目
http://projecteuler.net/index.php?section=problems&id=85
3 × 2 の長方形は 18 個の長方形を含んでいる。二百万に最も近い数の長方形を含む長方形の面積を求める。
a × b の長方形が含む長方形の個数は ab(a+1)(b+1)/4 となるので、(a, b) = (1, 2000) から始めて、面積が二百万より大きかったら b を減らし、小さかったら a を増やして調べていきます。
a b
1 2000 (大)
1 1999 (小)
2 1999 (大)
:
2 1154 (小)
3 1154 (大)
:
import Data.List import Data.Ord main = print $ euler085 2000000 euler085 :: Int -> Int euler085 n = getMin n (0, 0) $ takeWhile ((< n) . (f 1)) [1..] getMin :: Int -> (Int, Int) -> [Int] -> Int getMin n (a, b) [] = a * b getMin n (a, b) xs = if n < f (head xs) (last xs) then getMin n m $ init xs else getMin n m $ tail xs where m = minimumBy (comparing abs') [(a, b), (head xs, last xs)] abs' (x, y) = abs (f x y - n) f :: Int -> Int -> Int f a b = div (a * (a + 1) * b * (b + 1)) 4