본문 바로가기

Dot Algo∙ DS/PS

[BOJ] 백준 11689번 GCD(n,k) = 1 (Java)

    #11689 GCD(n,k) = 1

    난이도 : 골드 1

    유형 : 정수론 / Euler's phi function(오일러 파이 함수)

     

    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 의 개수를 출력한다.

     

    문제 풀이  

    오일러 파이 함수 (Euler's phi function) 문제이다. ϕ(n)은 n보다 작으면서 n과 서로소(k)인 개수이다.

     

    오일러 함수 성질

    오일러 곱셈적 함수

    ϕ(mn) = ϕ(m)*ϕ(n)가 성립된다. 증명 참고

     

     

    오일러 파이 함수계산

    p가 소수일 때 ϕ(p^a)의 계산법은 다음과 같다. p가 소수라면, p^a와 서로소가 아닌 수들은 반드시 p를 인수로 가져야 한다. 1부터 p^ka 지의 수 중 이런 수들은 p^a/p = p^a-1개가 있다. 따라서 다음 공식이 성립된다.

     

    풀이 코드 

    import java.io.*;
    
    public class Main {
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    		long n = Long.parseLong(br.readLine());
    		long pi = n;
    		for(long i=2; i*i<=n; i++) {
    			if(n%i==0) {
    				pi = pi/i*(i-1);
    			}
    			while(n%i==0) {
    				n/=i;
    			}
    			
    		}
    		if(n!=1) {
    			pi = pi/n*(n-1);
    		}
    		System.out.println(pi);
    	}
    }