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