지나가던 개발자
[Python] 백준 4355번(서로소) 문제 풀이 본문
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
'PS > Python' 카테고리의 다른 글
[Python] 백준 13985번(Equality) 문제 풀이 (0) | 2022.10.24 |
---|---|
[Python] 백준 15965번(K번째 소수) 문제 풀이 (0) | 2022.10.23 |
[Python] 백준 6992번(Arithmetic Sequence) 문제 풀이 (0) | 2022.10.22 |
[Python] 백준 1546번(평균) 문제 풀이 (0) | 2022.10.21 |
[Python] 백준 10769번(행복한지 슬픈지) 문제 풀이 (0) | 2022.10.21 |
Comments