手順 i だけ考える
手順 i だけを考えると、手順を 回繰り返したときの変数 の値は、 になります。
変数 の値にダブりがでるまでの手順 i の繰り返し回数を考えてみます。
と の最大公約数を として、 と表します。( は互いに素)
は の倍数になります。 0 から までの個の数のうち、 の倍数は
個です。
一方、 となる、つまり が の倍数となるためには、 が の倍数であることが必要です。
について、 の値がダブらずに 個の の倍数にばらまかれて、
のときに と同じ に戻ります。
そこで初めて、手順 ii が実行されます。
手順 ii の実行回数
のときに手順 ii が実行され、 になります。
そこから、 での の値は のときの値に +1 したものになります。
そして、 のときに と同じ に戻り、手順 ii によって になります。
このように、手順 ii は ごとに実行されます。
知りたいのは 番目の の値です。をで割ったときの商を 余りを とすると、
手順 ii は 回行われているため
が求める答えになります。
コード例 (Julia)
function solve_test() # 入力 readInts() = parse.(Int,split(readline())) # 入力データ N,D,K = readInts() # 最大公約数 g = gcd(N,D) # 周期 (何回で最初の位置に戻るか) n = div(N,g) # 手順 2-1 で加算する数の合計 P = div(K,n) # 余り R = K % n ans = (P + R * D) % N println(ans) end function solve() # 入力 readInt() = parse(Int,readline()) # 入力データ T = readInt() for i = 1:T solve_test() end end # function solve # main solve()