※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 11689번 문제인 GCD(n, k) = 1이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/11689
11689번: GCD(n, k) = 1
자연수 n이 주어졌을 때, GCD(n, k) = 1을 만족하는 자연수 1 ≤ k ≤ n 의 개수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
Euler's totient function(Euler phi; 이하 오일러 파이 함수)을 아는지, 그리고 이를 구현할 수 있는지를 묻는 문제이다.
이 함수는 양의 정수 n에 대하여 n과 서로 소인 n 이하의 자연수의 개수를 세는 함수이다.
양의 정수 N의 오일러 파이함수의 값은 N에 각 소인수 p마다 (p-1)/p를 곱하는 것으로 구할 수 있다는 점을 상기하면, 남은 것은 이를 반복문으로 구현하는 것 뿐이다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
ll N; cin >> N;
ll ans = N;
ll idx = 2;
while (idx * idx <= N) {
if (N % idx == 0) {
ans /= idx;
ans *= idx - 1;
while (N % idx == 0) {
N /= idx;
}
}
idx++;
}
if (N > 1) {
ans /= N;
ans *= N - 1;
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 17425 // C++] 약수의 합 (0) | 2021.11.19 |
---|---|
[BOJ 9359 // C++] 서로소 (0) | 2021.11.18 |
[BOJ 15897 // C++] 잘못 구현한 에라토스테네스의 체 (0) | 2021.11.16 |
[BOJ 15907 // C++] Acka의 리듬 세상 (0) | 2021.11.15 |
[BOJ 16936 // C++] 나3곱2 (1) | 2021.11.14 |