🏆

ABC406 を Haskell で

に公開

1 完惨敗。
あと環境構築不足でコンテスト中にローカル環境の hls を使えなくなってしまったので、再度構築を見直さないといけない。

A

solve :: Int -> Int -> Int -> Int -> Bool
solve h1 m1 h2 m2 =
    (h1 > h2) || (h1 == h2 && m1 > m2)

main :: IO ()
main = do
    [a, b, c, d] <- ints
    putStrLn $ if solve a b c d then "Yes" else "No"

B

10^{18} を超えたら 1 を返し、それ以外の場合は積を返す計算機の挙動を、与えらえた数列に対して左からたたみ込む。
コンテスト中 AC できなかった原因は nm < k \Leftrightarrow n < \lfloor\frac{k}{m}\rfloor が頭から抜けていたこと。
このくらいは Haskell かどうかに関係なくさらっと解きたい。

solve :: Int -> [Integer] -> Integer
solve k = foldl' calcMul 1
  where
    cantCalc :: Integer -> Integer -> Bool
    cantCalc n m = n > (10 ^ k - 1) `div` m

    calcMul :: Integer -> Integer -> Integer
    calcMul n m = if cantCalc n m then 1 else n * m

main :: IO ()
main = do
    [_, k] <- ints
    as <- integers
    print $ solve k as

Discussion