득이공간
[백준 C++] 11689 GCD(n, k) = 1 - 오일러피 본문
11689번: GCD(n, k) = 1
자연수 n이 주어졌을 때, GCD(n, k) = 1을 만족하는 자연수 1 ≤ k ≤ n 의 개수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
long long N;
cin >> N;
long long P = N;
for (int i = 2; i <= sqrt(N); ++i)
{
if (N % i != 0)
{
continue;
}
P = P - P / i;
while (N % i == 0)
{
N /= i;
}
}
if (N > 1)
{
P = P - P / N;
}
cout << P;
}
1부터 N까지 범위에서 N과 서로소인 자연수의 개수를 출력하는 문제입니다.
오일러 피 함수(P[N] = P[N] - P[N] / K)를 이용하고, 탐색 범위를 소인수 분해를 통해서 좁혀나가도록 해서 풀었습니다.
N의 입력 가능 범위가 크기 때문에 자료형과 시간 복잡도 측면에서 주의가 필요합니다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[백준 C++] 18111 마인크래프트 - 브루트포스 (1) | 2024.02.13 |
---|---|
[백준 C++] 1735 분수 합 - 유클리드호제법 (1) | 2024.02.12 |
[백준 C++] 1929 소수 구하기 - 에라토스테네스의체 (0) | 2024.02.12 |
[백준 C++] 11438 LCA 2 - 최소공통조상 (1) | 2024.02.12 |
[백준 C++] 3584 가장 가까운 공통 조상 - 최소공통조상 (1) | 2024.02.12 |