AtCoder ABC 290 D問題 解説補足

Marking

D - Marking

0から番号が振られたN個のマスが並んでいる。

変数 x を次のとおりに更新し、そのマス番号に印をつけていく。

  1. x = 0

  2. マス x に移動する

    1. 印がついていない場合は、 x = (x + D) mod N に更新する

    2. 印がついている場合は、 x = (x + 1) mod N に更新する

  3. 2を繰り返す。

K番目に印がつけられるマス番号を求めよ。

解説

定理を2つ導入する。


定理1

$${x = D \bmod N}$$ とすると

$$
\begin{align*}
x + (r-1)D & \equiv rD \pmod N \\
\end{align*}
$$

証明

$${D \bmod N = {\color{red}x}}$$ より、$${D = mN + {\color{red}x}}$$ と置くと、$${{\color{red} x} = D - mN}$$ であるから、

$$
\begin{align*}
{\color{red}x} + (r-1)D &= (D -mN) + (r-1)D \\
&= rD - mN \\
& \equiv rD \pmod N \\
\end{align*}
$$

ゆえに印がついていない場合は、

0 → D mod N → 2D mod N → 3D mod N → … → rD mod N

とマスを移動していく。


定理2

DとNの最大公約数を g とし、 $${N = ng}$$ とした時、 $${rD \bmod N}$$ の周期は n である。

証明

正整数 N, D において、最大公約数を g とすると、

  • $${N = ng}$$

  • $${D = dg}$$

となる n, d が得られる。

この時、N と d が互いに素であるから、mod演算において d で割ることができる。

$$
\begin{align*}
D &\equiv g \\
2D &\equiv 2g \\
3D &\equiv 3g \\
&\vdots \\
(n-1) D &\equiv (n-1)g \\
nD &\equiv ng = {\color{red}0}\\
(n+1)D &\equiv (n+1)g = {\color{red}g} \\
&\vdots \\
\end{align*}
$$

rD mod N の周期は n 

従って、 $${rD \bmod N}$$ は 周期 n である。


定理1, 2 からDとNの最大公約数を g とし、 $${N = ng}$$ とした時、

マスの移動を n 回行うと同じマスに再度訪れることとなる。

ex N = 6, D = 8のとき、 g = 2 であるから、 n = 3 となり、 3回目の移動で印があるマスに訪れることになる。

N = 6, D = 8の時のマス移動

ゆえに K回移動して、マスの番号が

$$
(rD + q) \bmod N
$$

であったとすると、0からスタートし、周期 n より、

  • $${r = (K-1) \;\%\; n}$$

  • $${q = (K - 1) \;/\; n}$$

が導かれる。

解説追記

NとDの最大公約数が g とすると、これは N x D の長方形 を 正方形 g で分割できることを意味する。

N X Dの長方形 と 最大公約数 g 

従って K番目に移動するマスの番号 $${(rD + q)\bmod N}$$ は、

以下の図のように、ブロック g を並べることで求めることができる。

ブロック g を並べたとき

いいなと思ったら応援しよう!