지나가던 개발자

[Python] 백준 4355번(서로소) 문제 풀이 본문

PS/Python

[Python] 백준 4355번(서로소) 문제 풀이

KwonYongHyeon 2022. 10. 22. 14:46

 

def power(A, n):
    res = 1
    while n:
        if n % 2 != 0:
            res *= A
        A *= A
        n //= 2
    return res

def factorization(x): 
    d = 2 
    factorization = []
    while d <= x: 
        if x % d == 0: 
            factorization.append(d)
            x = x / d 
        else: 
            d = d + 1
    return factorization
    
    
while True:
    n = int(input())
    if n == 0:
        break
    primes = factorization(n)
    k = 1
    for p in set(primes):
        k *= power(p, (primes.count(p)-1)) * (p-1)
    print(k)

 

오일러 피 함수(Euler's phi function)와 분할 정복을 이용한 거듭제곱 알고리즘을 사용하여 해결했다.

 


 

이 글을 쓰는 데 도움이 되었던 자료들:

 

https://zoosso.tistory.com/243

 

오일러 피(파이) 함수(Euler's phi function)

오일러 피(파이) 함수 ϕ(n) 1~n까지의 수 중에서 n과 서로소인 수의 갯수 ※ 서로소 관계: 두 수 a, b의 공약수가 1뿐인 두 정수를 의미한다.    ϕ(1) = 1 (1은 1과 서로소)    ϕ(8) = { 1, 3, 5, 7 } =..

zoosso.tistory.com

 

https://hbj0209.tistory.com/43

 

[Algorithm] 분할정복을 이용한 거듭제곱

# 분할정복을 이용한 거듭제곱 - C**n연산은 x를 n번 곱하므로 O(N)이지만, 이 방법을 사용하면 O(logN)에 거듭제곱 값을 구할 수 있다. - 아래 코드에서 fpow함수가 그 방법이다. - n이 1이면 그냥 C의 1

hbj0209.tistory.com

Comments