Codeforces 194B - B. Square

194B - B. Square

  • 左下隅からスタートして、はじめて4隅に止まるのは何ステップ目だろうか。
  • 小さいサイズで試してみる。
  • 正方形のサイズを n とすると、
    • n = 1 のときは、1 ステップ目で四隅にはじめて到達する
    • n = 2 のときは、2 ステップ目
    • n = 3 のときは、3 ステップ目
    • サイズが n のときは n ステップ目で四隅にはじめて到達する。サイズ n に対して、n+1 だけ進むのだから、n で割った余りを考えれば当然だ。
  • n ステップ目で 4 隅のうちのどこにいるかは進んだ距離から求めることが出来る(進む距離は n*(n+1))。
  • n*1, n*2, n*3, … と順番に元の位置に戻ったかどうかを調べればよい。
calc :: Integer -> Integer
calc n = head [i*n+1 | i <- [1..], ((n+1)*n*i) `mod` (n*4) == 0]

putLs [] = return ()
putLs (x:xs) = do putStrLn x
                  putLs xs

main = do s <- getLine
          t <- getLine
          putLs $ map (\a -> show $ calc (read a :: Integer)) $ words t

はまったこと。

  • `mod`と +, - の演算子の優先順位ではまった。
Prelude> 9+1 `mod` 3
10
Prelude> 9*1 `mod` 3
0