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은 무조건 소수이므로 지워줘야한다.
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 / 그래프] 1717 : 집합의 표현 (python) (0) | 2024.04.10 |
---|---|
[백준 / 정수론] 14565 : 역원(Inverse) 구하기 (python) (0) | 2024.04.08 |
[백준 / 정수론] 2609 : 최대공약수와 최소공배수 (python) (0) | 2024.04.08 |
[백준 / 정수론] 1978 : 소수 찾기 (python) (0) | 2024.04.08 |
[백준 / 소수] 1456 : 거의 소수 (python) (0) | 2024.04.05 |