roiti46's blog

主に競プロ問題の解説を載せてます

Unkoder #05 B: GCD and LCM

CFに出てきそうな問題だ。

問題はこちら

問題

自然数 a, d, m が与えられる。gcd(a, x) = d, lcm(a, x) = m となるような自然数xを1つ答えよ。そのようなxがなければ-1と出力せよ。

解法

lcm(a, x) = ax / gcd(a, x) であるから、x = md / a と書ける。しかし、md がaで割り切れるとは限らないので x = lcm(md, a) / a とする。あとはこのxで実際に gcd(a, x) = d, lcm(a, x) = m となるかどうかを確認すればいい。

def gcd(a, b): 
    while b: a, b = b, a % b
    return a

def lcm(a, b):
    return a * b / gcd(a, b)

a, d, m = map(int, raw_input().split())
x = lcm(m * d, a) / a
if gcd(a, x) == d and lcm(a, x) == m:
    print x
else:
    print -1

まとめ

lcm, gcd の練習問題としてよくできていると思う。