D - Only one of two Editorial by tatyam


\(N, M\) をそれぞれ \(\text{GCD}(N, M)\) で割って、\(N\)\(M\) は互いに素であるものとします。

\(N\)\(M\) のうちちょうど一方で割り切れる数の集合」は \(N \times M\) 周期になっていて、\(1\) 周期に \(N + M - 2\) 個の要素が含まれます。\(S := N + M - 2\) と定義します。

周期的なので、\(S\) で割ったあまりを取って \(1 \le K \le S\) の場合を解けば良いです。これは、\(N\) の倍数の列と \(M\) の倍数の列をマージして \(K\) 番目の要素を得る問題なので、\(O(K)\) 時間で解くことができます。

実装例 (Python)

from math import gcd

N, M, K = map(int, input().split())
# gcd で割る
G = gcd(N, M)
N //= G
M //= G

S = N + M - 2
K -= 1

# S で割る
ans = (K // S) * (N * M)
K %= S

# 答えを求める
n = N
m = M
for _ in range(K):
    if n < m:
        n += N
    else:
        m += M
ans += min(n, m)

# gcd で割ったのを戻す
print(ans * G)

posted:
last update: