D - Only one of two Editorial
by
tatyam
をそれぞれ で割って、 と は互いに素であるものとします。
「 と のうちちょうど一方で割り切れる数の集合」は 周期になっていて、 周期に 個の要素が含まれます。 と定義します。
周期的なので、 で割ったあまりを取って の場合を解けば良いです。これは、 の倍数の列と の倍数の列をマージして 番目の要素を得る問題なので、 時間で解くことができます。
実装例 (Python)
Copy
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)
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: