풀이
Euclidean algorithm을 사용해 풀이할 수 있지만, 최대 10^12의 수들에 대해 계산을 해야하므로 시간제한에 걸린다.
Euler product formula을 사용해 쉽게 풀이할 수 있다.
나누어 떨어지는 소인수(p)를 찾아 Euler product formula에 적용시키면 된다.
p-1 / p (= 1- 1/p)를 n에 곱해주어야 한다. p로 먼저 나눈 후 p-1을 곱해주자.
for (long long p = 2; p*p <= n; pf++){
if (n % p == 0) euler = euler/p *(p - 1);
그런 다음 계속해서 소인수를 찾을지 말지 여부를 결정해주기 위해 n이 p로 나누어 떨어지지 않을 때까지, n에 대하여 Euler product formula을 적용시키면 된다.
while (n % p == 0) n = n/p;
다음과 같은 예외가 있다.
- n이 소수일 때
- n이 지수가 1인 소인수를 가질 때
Euler product formula을 1회 적용해 두 조건에 대한 euler를 얻을 수 있다.
소스코드
#include <stdio.h>
int main(){
long long n;
scanf("%lld", &n);
long long euler = n;
for (long long p = 2; p*p <= n; p++){
if (n % p == 0) euler = euler/p *(p - 1);
while (n % p == 0) n = n/p;
}
printf("%lld", n == 1 ? euler : euler/n *(n - 1));
}
출처 및 참고자료
'PS > Baekjoon Online Judge' 카테고리의 다른 글
[백준 14860] GCD 곱 [C] (0) | 2021.08.11 |
---|---|
[백준 4355] 서로소 [C] (0) | 2021.08.11 |
[백준 17626] Four Squares [C] (0) | 2021.08.11 |
[백준 15657] N과 M (8) [C] (0) | 2021.08.10 |
[백준 15654] N과 M (5) [C] (0) | 2021.08.10 |