티스토리 뷰
https://www.acmicpc.net/problem/11689
11689번: GCD(n, k) = 1
자연수 n이 주어졌을 때, GCD(n, k) = 1을 만족하는 자연수 1 ≤ k ≤ n 의 개수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
오일러 파이 함수를 구하는 문제입니다.
오일러 파이 함수는 phi(n) = n * (1-1/p1) * ... * (1-1/pk) 입니다.
(p1, p2, ..., pk : n의 소인수)
이를 이용해 n에 대한 소인수만 먼저 구한 뒤 공식을 그대로 적용하면 됩니다.
코드는 아래와 같습니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
long long n;
vector<long long> factors;
// 오일러 파이 함수 공식 그냥 쓰기
// 소인수만 찾으면 됨
void init()
{
cin >> n;
}
void calc_factors()
{
long long p;
long long num = n;
// root(n) <= 10^6
for(p = 2; p * p <= num; p++) {
if(num % p == 0) {
factors.push_back(p);
}
while(num % p == 0) {
num /= p;
}
}
// root(n)보다 큰 소수 남은 거
// 또는 n이 prime인 경우
if(num > 1)
factors.push_back(num);
}
void euler()
{
// n = 1 경우
if(n == 1) {
cout << 1;
return;
}
// n 소수인 경우
if(factors[0] == n) {
cout << n - 1;
return;
}
// 나머지 경우
long long ans = n;
for(auto p : factors) {
ans /= p;
ans *= (p - 1);
}
cout << ans;
}
int main()
{
init();
calc_factors();
euler();
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 14426 접두사 찾기 C++ (0) | 2023.09.29 |
---|---|
백준 1201 NMK C++ (0) | 2023.06.27 |
백준 12738 가장 긴 증가하는 부분 수열 3 C++ (0) | 2023.05.02 |
백준 2086 피보나치 수의 합 C++ (1) | 2023.04.14 |
백준 10220 Self Representing Seq python3 (0) | 2023.03.28 |
댓글