※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts