"꾸준하고 완벽한 한 걸음"

PS/Baekjoon Online Judge

[백준 02436] 공약수 [Python]

kimyoungrok 2025. 2. 19. 00:55
728x90

문제

https://www.acmicpc.net/problem/2436

 


풀이

두 수 A, B의 GCD, LCM이 주어질 때, 두 수의 합이 최소가 되는 수를 구하는 문제다.

이때 두 수의 범위 2 ~ 1억에 대해 GCD, LCM을 전부 구해 비교하는 방법은 시간 초과가 발생한다.

탐색 범위를 좁혀보자.

$G = GCD(A, B), L = LCM(A, B)$일 때, $AB = GL$, $A = Gx$, $B = Gy$

이므로 $AB = G^2xy = GL, xy = \frac{L}{G} = K$가 성립한다.

K의 모든 약수 쌍 중 $GCD(A, B) = G*GCD(x, y)$를 만족해야 하므로, $GCD(x, y) = 1$인 약수만 해당된다.

    K = LCM // GCD
    x, y = 0, 0
    for d in range(1, int(K**0.5) + 1):
        if K % d == 0 and gcd(d, K // d) == 1:
            x = d
            y = K // d

두 수의 합이 최소가 되기 위해서는 가장 마지막에 찾은 $x, y$에 $G$를 곱하면 된다.

    # Output
    print(GCD * x, GCD * y)

소스코드

https://github.com/rogi-rogi/problem-solving/blob/main/baekjoon-online-judge/normal/02436.py

728x90

'PS > Baekjoon Online Judge' 카테고리의 다른 글

[백준 01935] 후위 표기식2 [Python]  (0) 2025.02.19
[백준 22943] 수 [Java]  (0) 2025.02.19
[백준 01934] 최소공배수 [Python]  (0) 2025.02.18
[백준 11772] POT [Java]  (0) 2025.02.18
[백준 11648] 지속 [Java]  (0) 2025.02.18