반응형
https://www.acmicpc.net/problem/11689
11689번: GCD(n, k) = 1
자연수 n이 주어졌을 때, GCD(n, k) = 1을 만족하는 자연수 1 ≤ k ≤ n 의 개수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
[ 문제풀이 ]
이 문제를 풀기 전에 다음 글을 먼저 읽어보시는 걸 추천드립니다!
https://rudalsd.tistory.com/59?category=1064608
[ 알고리즘 ] 오일러 피 함수(Euler's phi function)
오일러 피(파이) 함수(Euler's phi function)는 1부터 n까지의 정수 중 n과 서로소인 수의 개수를 구하는 함수이고, Ф(n)으로 표현합니다. 이때, 서로소는 1 이외에 공약수를 갖지 않는 둘 이상의 양의
rudalsd.tistory.com
위의 공식을 이용하여 ans에 n을 대입한 후 n에 대하여 어떠한 수 i로 나누어지면 ans = ans - ans / i를 통해서 답을 구할 수 있습니다.
이때 i * i <= n까지 구하는 이유는 n의 제곱근은 i보다 작거나 같기때문입니다.
하지만 마지막에 n이 1이 아니라면 남은 n은 소수이므로 n이 1이 아닐 때 마지막으로 ans = ans - ans / n을 해주면 답을 구할 수 있습니다.
[ 소스 코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include<iostream> #define ll long long using namespace std; ll n; ll ans; int main() { cin >> n; ans = n; for (ll i = 2; i * i <= n; i++) { int cnt = 0; bool flag = false; while (n % i == 0) { //소인수분해 n /= i; flag = true; } if (flag) { //오일러 피 ans = ans - ans / i; } } if (n != 1) { //남은 n이 소수라면 ans = ans - ans / n; } cout << ans; } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 14428번 - 수열과 쿼리 16 (C++) (0) | 2022.07.13 |
---|---|
[ 백준 ] 13977번 - 이항 계수와 쿼리 (C++) (0) | 2022.07.12 |
[ 백준 ] 3015번 - 오아시스 재결합 (C++) (0) | 2022.07.10 |
[ 백준 ] 11505번 - 구간 곱 구하기 (C++) (0) | 2022.07.09 |
[ 백준 ] 2096번 - 내려가기 (C++) (0) | 2022.07.08 |