오일러 피 함수의 구현
오일러 피 함수는 주어진 수를 소인수분해한뒤
소인수분해된 수들을 다음과 같은 규칙에 따라 계산하면 된다
P(소수) = A^a * B^b * C^c ......
f(P) = (A^a - A^(a-1) * (B^b - B^(b-1)) ......
그럼 이제 이 문제는 주어진 수를 빠르게 소인수분해하는 문제가 된다.
https://www.acmicpc.net/problem/11689
11689번: GCD(n, k) = 1
자연수 n이 주어졌을 때, GCD(n, k) = 1을 만족하는 자연수 1 ≤ k ≤ n 의 개수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
map<ll,ll> prime;
int main(){
ll n;
ll ans = 1;
scanf("%lld", &n);
if(n==1){ printf("1"); return 0; }
ll k = 2;
while(k*k <= n){
if(n%k == 0){
prime[k]++;
n /= k;
continue;
}
k++;
}
prime[n]++;
for(auto it=prime.begin(); it!=prime.end(); it++){ ans *= ((ll)pow(it->first, it->second) - (ll)pow(it->first, it->second-1)); }
printf("%lld", ans);
return 0;
}
반응형