알고리즘/백준
[백준 / 정수론] 11689 : GCD(n, k) = 1 (python)
난감
2024. 4. 8. 01:27
728x90
문제 설명
문제
자연수 n이 주어졌을 때, GCD(n, k) = 1을 만족하는 자연수 1 ≤ k ≤ n 의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 n (1 ≤ n ≤ 1012)이 주어진다.
출력
GCD(n, k) = 1을 만족하는 자연수 1 ≤ k ≤ n 의 개수를 출력한다.
예제 입력 1
1
예제 출력 1
1
예제 입력 2
5
예제 출력 2
4
예제 입력 3
10
예제 출력 3
4
예제 입력 4
45
예제 출력 4
24
예제 입력 5
99
예제 출력 5
60
풀이
import math
n = int(input())
res = n
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
res -= res / i
while n % i == 0:
n /= i
if n > 1:
res -= res / n
print(int(res))
- GCD(n, k) = 1는 최대공약수가 1개라는 뜻이므로 서로소를 구하면 되는 문제이다.
- 서로소 구하기는 오일러 피 함수를 활용하면 쉽게 풀 수 있다.
while n % i == 0:
n /= i
- i가 소수여야 하므로 n에 포함된 i를 다 없애줌.
- 3^7 * 5 의 경우, 3을 모두 제거함.( i == 3 )
if n > 1:
res -= res / n
- 마지막 소인수가 남았을 경우 지워준다.
- n이 1보다 큰 경우는 소인수가 남아있다는 뜻이다. 따라서 남은 n은 무조건 소수이므로 지워줘야한다.
반응형