D - Only one of two Editorial by tatyam


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

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

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

実装例 (Python)

Copy
  1. from math import gcd
  2. N, M, K = map(int, input().split())
  3. # gcd で割る
  4. G = gcd(N, M)
  5. N //= G
  6. M //= G
  7. S = N + M - 2
  8. K -= 1
  9. # S で割る
  10. ans = (K // S) * (N * M)
  11. K %= S
  12. # 答えを求める
  13. n = N
  14. m = M
  15. for _ in range(K):
  16. if n < m:
  17. n += N
  18. else:
  19. m += M
  20. ans += min(n, m)
  21. # gcd で割ったのを戻す
  22. print(ans * G)
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:



2025-04-29 (Tue)
02:55:35 +00:00