크게 생각하고, 목표를 높게 잡고, 대담하게 행동하라.

“언젠가는 목표에 이를지도 모르는 단계를 밟는 것으로는 언제나 실패한다. 모든 단계가 그 자체로 목표인 동시에 목표로 이르는 단계여야한다.” - 괴테

알고리즘/수학

[Python] 백준 11689 - GCD(n, k) = 1

o_onn5 2023. 2. 15. 07:31
728x90
 

11689번: GCD(n, k) = 1

자연수 n이 주어졌을 때, GCD(n, k) = 1을 만족하는 자연수 1 ≤ k ≤ n 의 개수를 구하는 프로그램을 작성하시오.

www.acmicpc.net


문제

자연수 n이 주어졌을 때, GCD(n, k) = 1을 만족하는 자연수 1 ≤ k ≤ n 의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 자연수 n (1 ≤ n ≤ 1012)이 주어진다.

출력

GCD(n, k) = 1을 만족하는 자연수 1 ≤ k ≤ n 의 개수를 출력한다.


n이 주어졌을 때 n이하의 서로소 개수를 구하면 된다는 뜻이다.

이 문제를 해결하는 기가 막힌 공식이 있다. 오일러 피 함수인데 n이하의 서로소 개수를 구하는 공식이다.

진행 과정은 아래와 같다.

0. n을 정한다.
1. 소인수를 구한다.(소인수를 p라 하자)
2. n에 (1 - 1/p)를 곱한다.

간단하다. 

 

위 공식에 대한 증명은 아래에서 보자. 

https://ko.wikipedia.org/wiki/%EC%98%A4%EC%9D%BC%EB%9F%AC_%ED%94%BC_%ED%95%A8%EC%88%98

 

오일러 피 함수 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 오일러 파이 함수의 그래프. ϕ(1)부터 ϕ(1000)까지의 값들을 나타낸다. 수론에서 오일러 파이 함수(-函數, 영어: Euler’s phi (totient) function)는 정수환의 몫환의 가

ko.wikipedia.org


코드

n=int(input())
ans = n

for i in range(2, int(n**0.5)+1):
    # i로 나누어 떨어진다면
    if n % i == 0:
        # n이 가지고 있는 i의 개수 만큼 나눠주기
        while n % i == 0:   
            n //= i
        # 오일러 피 함수 
        ans *= (1-1/i)

# 자기 자신이 소수였던 경우
if n>1:
    ans *= (1-1/n)

print(int(ans))
728x90