문제 : https://www.acmicpc.net/problem/4355
[알고리즘풀이]
정수론 시간에 배운 Euler Phi Function(오일러 파이 함수)를 이용해서 답을 도출할 수 있었습니다.
오늘은 간략하게 설명하고, 다음에 오일러 파이 함수는 따로 포스팅을 해보도록 하겠습니다.
양의 정수 N이 다음과 같이 소인수분해가 된다고 한다면,
N과 서로소인 수의 갯수 = Euler_Phi(N) 은 다음과 같습니다.
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
bool era[100001];
long long euler_phi(int n) {
// 먼저 n을 소인수분해해야된다.
vector<int> v, c;
long long answer = 1;
for (int i = 2; i <= 100000; i++) {
if (era[i] == false && n % i == 0) {
v.push_back(i);
int count = 0;
while (n % i == 0) {
n /= i;
count++;
}
c.push_back(count);
}
}
for (int i = 0; i < v.size(); i++) {
answer *= ((int)(pow(v[i], c[i])) - (int)(pow(v[i], c[i] - 1)));
}
if (n == 1)
return answer;
else
return answer * (n - 1);
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
for (int i = 2; i <= 100000; i++) {
if (era[i] == false) {
for (int j = 2 * i; j <= 100000; j += i)
era[j] = true;
}
}
while (1) {
int n;
cin >> n;
if (n == 0)
return 0;
cout << euler_phi(n) << '\n';
}
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 2875 - TIMSKO (0) | 2019.09.23 |
---|---|
[BOJ] 1212 - 8진수 2진수 (0) | 2019.09.23 |
[BOJ] 14889 - 스타트와 링크 (0) | 2019.09.21 |
[BOJ] 14888 - 연산자 끼워넣기 (0) | 2019.09.21 |
[BOJ] 2580 - 스도쿠 (0) | 2019.09.21 |