Week 01 ~ 04 : 알고리즘 문제 풀이

파이썬 백준 3955 캔디 분배

정글러 2021. 11. 17. 20:24
def euc(a, b) :
    x0, x1, y0, y1 = 1, 0, 0, 1
    A = a
    # a = bq0 + r1
    # b = r1q1 + r2
    # r1 = r2q2 + r3
    # ...
    while b != 0 :
        q = a // b
        r = a % b
        a = b
        b = r
        x0, x1 = x1, x0 - q*x1
        y0, y1 = y1, y0 - q*y1
    if a != 1 or y0 > 10**9 :
        return 'IMPOSSIBLE'
    if y0 < 0 :
        y0 = y0 + A
    return y0

n = int(input())
for i in range(n) :
    k, c = map(int, input().split())
    if c == 1 :
        if k < 10**9 :
            print(k + 1)
        else :
            print('IMPOSSIBLE')
        continue
    if k == 1 :
        print(1)
        continue
    print(euc(k, c))

확장 유클리드 호제법을 코드로 구현하는 문제이다.

ax + by = c의 정수해 (x, y)는 c가 a, b의 공약수(최대공약수였나?)가 아니라면 존재하지 않는다.

문제의 조건에서 c는 1이니 호제법을 돌리는 과정에서 gcd가 1인지 확인하고, 1이라면 그때의 정수해를 출력한다.

 

처음보고 아 이거 그건데 그... 하면서 머리를 싸매다가 검색하고 나면 무릎을 탁 치고 구현이 되는 상황의 반복

집나간 수학과 지식들이 머리속으로 돌아오고 있다...