알고리즘/백준

[백준 / 정수론] 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은 무조건 소수이므로 지워줘야한다.

 

반응형