ABC 290
Table of Contents
D - Marking
方針がなかなか決まらなくて諦めかけたがなんとか自力 AC。
$x_k$ を $k$ 番目に印をつけられるマスの番号とする。
すでに印がつけられていたとしても i
の操作で移動したとすると
\begin{align} x_1 &= 0 \nonumber \\ x_2 &= x_1 + D \mod N \nonumber \\ x_3 &= x_2 + D \mod N \nonumber \\ \vdots \nonumber \\ x_k &= x_{k-1} + D \mod N \nonumber \\ \end{align}
これより、$x_k = x_1 + (k-1)D \mod N$ ということがわかる。
操作 ii
が初めて起こるのは $\alpha D \equiv 0 \mod N$ となる最小の正の整数 $\alpha$ のときである。すなわち、$\alpha D$ が $N$ の倍数となるような最小の正の整数 $\alpha$ を見つけることができれば周期がわかる。よって操作 ii
が何回行われたのかもわかる。
$\alpha D = \mathrm{lcm} (N, D)$ だから $\alpha = D / \mathrm{lcm}(N, D)$
これらより $k$ 番目に印がつけられるマスは $\lfloor \frac{k-1}{\alpha} \rfloor$ 回 操作 ii
を実行したあと $k-1 \mod \alpha$ 回 操作 i
をしたときのマスであるから
$x_k = \lfloor \frac{k-1}{\alpha} \rfloor + (k-1 \mod \alpha) D \mod N$ である。
※ $n\alpha D \equiv 0 \mod N~ (n \in \mathbb{Z})$ なので $x_k = \lfloor \frac{k-1}{\alpha} \rfloor + (k-1) D \mod N$ としても結果は同じ。
void solve() {
int T;
cin >> T;
rep(i, T) {
ll n, d, k;
cin >> n >> d >> k;
// ll g = gcd(n, d);
// ll a = n / g;
ll a = lcm(n, d) / d;
cout << ((k - 1) / a + ((k - 1) % a) * d) % n << endl;
}
}