baekjoon

[백준]11689 GCD(n,k) - 오일러 파이 함수

윤만석 2023. 7. 3. 10:28

문제

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

입력

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

출력

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

 

자연수 N이 있을때, N보다 같거나 작은 수 중에서 N과 소인수인 수의 개수를 구하는 문제입니다.

 

오일러 파이함수를 사용해 해결할 수 있습니다.

 

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

int main() {

    ll n;
    cin >> n;
    ll ans = n;
    for (ll i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            ans *= (1-(double)1/i);
            while (n % i == 0)
                n /= i;
        }
    }
    if (n > 1){
        ans*= (1 - (double)1 / n);
    }
    cout << ans;
}