1. ๋ฌธ์ ์ค๋ช ๐
(1) ๋งํฌ๐
https://www.acmicpc.net/problem/11689
(2) ํด์ค๐ต
์ค์ผ๋ฌ์ ํผ๋ฅผ ์๊ณ ์๋์ง ๋ฌป๋ ๋ฌธ์ ์ด๋ค. ์ค์ผ๋ฌ์ ํผ ํจ์ $φ(n)$ ์ด๋, n ์ดํ ์์ฐ์ ์ค n๊ณผ ์๋ก์์ธ ์ซ์์ ๊ฐ์๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.
์ ๋ฒ ์ค์ผ๋ฌ์ ํผ ์ด๋ก ์ ๋ฆฌ ํฌ์คํ
์์๋ N๊ฐ์ ์์ญ ๋ด์ ๋ชจ๋ ์์ ๋ํ ์ค์ผ๋ฌ์ ํผ ํจ์๋ฅผ ๊ตฌํ๋๋ฐ, ์ด๋ฒ ๋ฌธ์ ๋ N์ ์ต๋๊ฐ์ด $10^{12}$ ์ฌ์ ๊ทธ๋ฌํ ๋ฐฐ์ด์ ๋ง๋ค ์๋ ์๊ณ , ๋ฌธ์ ์์๋ N ํ๋์ ๋ํ ์ค์ผ๋ฌ ํผ ํจ์๋ฅผ ๊ตฌํ๋ผ ํ์ผ๋ฏ๋ก, N์ ๋ํด์๋ง ์ค์ผ๋ฌ ํผ ํจ์๋ฅผ ๊ตฌํ๋ฉด ๋๋ค.
2. ์๊ฐ์ ํ๋ฆ: ์ฝ๋๊ฐ ๋์ค๊ธฐ๊น์ง ๐๏ธ
(1) IDEA ๋์ถ๐ก
KEY WORD
: ์๋ผํ ์คํ
๋ค์ค์ ์ฒด
, ์ค์ผ๋ฌ ํผ ํจ์
์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ฅผ ๋ฐ๋ก ๊ตฌํ ๋ฉ๋ชจ๋ฆฌ๋ ์๊ฐ์ด ์๋ค. ๋ฐ๋ผ์ ๊ทธ๋ฅ i = 2๋ถํฐ ์์ํด์ $ \sqrt{N}$๊น์ง ๋ชจ๋ ์๋ฅผ ํ์ธํ๋ค. ์ด๋ฌ๋ฉด $10^{6}$๊น์ง๋ง ํ์ธํ๋ฉด ๋์ด์ ์๊ฐ ์ด๊ณผ๋ ๋์ง ์๋๋ค. ํด๋น ๋ฌธ์ ๋ ๋ง๋ก๋ง ์ค๋ช ํ๊ธฐ ์ด๋ ค์ SUDO CODE๋ฅผ ๋จผ์ ํ์ธํ๊ณ , ๋ถ์ฐ ์ค๋ช ์ ์ด์ด๊ฐ๊ฒ ๋ค.
(2) SUDO CODE ๐
- 0๏ธโฃ
ans
: ์ค์ผ๋ฌ ํผ ํจ์์ ๊ฒฐ๊ณผ,n
: ์ค์ผ๋ฌ ํผ ํจ์์ ์ธ์(์ ๋ ฅ),p
= ๋ง๋๋ ์์ - 1๏ธโฃ p = 2๋ถํฐ $\sqrt{n}$ ๊น์ง ํ์ธํ๋ค.
- 2๏ธโฃ ๋ง์ฝ
n%p == 0
์ด๋ฉด p๋ n์ ์์ธ์์ด๋ค! (p๋ $\sqrt{n}$๋ด์ ๋ชจ๋ ์์ธ๋ฐ, ์ ๊ทธ๋ ๊ฒ ๋๋์ง๋ ๋ค์ ๊ฐ์ ์ค๋ช ํ๊ฒ ๋ค.) - 3๏ธโฃ n์ด p๋ก ๋๋์ด ๋จ์ด์ง์ง ์์ ๋๊น์ง p๋ก ๋๋๋ค.
- 4๏ธโฃ ์ดํ
ans
=ans - ans/p
๊ณ์ฐ์ ํ๋ค. (์ค์ผ๋ฌ์ ๊ณฑ ๊ณต์์ ์ ์ง์ ์ผ๋ก ์ ์ฉ) - 5๏ธโฃ 1~4์ ๋ฐ๋ณต์ด ๋๋ฌ๋๋ฐ๋,
n > 1
์ด๋ฉด,ans
=ans - ans/n
์ ํด์ค๋ค. - 6๏ธโฃ ๋ต์
ans
์
(3) ๋ถ๊ฐ ์ค๋ช
2๏ธโฃ๋ฒ์์ n%p == 0
์ด ๋๋ p๋ ๋ฌด์กฐ๊ฑด ์์์ธ ์ด์
3๏ธโฃ๋ฒ์์ ํด๋น ์์์ ์ ๊ณฑ์ ๋ชจ๋ ์ ๊ฑฐํ๋ค. ์๋ฅผ ๋ค์ด $2^{11} * 7$์ด๋ผ๋ ์ซ์์ด๋ฉด 2๋ฅผ ๋ง๋ฌ์ ๋, $2^{11}$์ ๋ชจ๋ ์์ ๋ ๊ฒ์ด๋ค. ์ฆ ์ดํ 2์ ๋ฐฐ์๋ค์ n์ ์ ๋ ๋๋์ด ๋จ์ด์ง๊ฒ ๋๋์ง ๋ชปํ๋ค. ์ด๋ ๊ฒ ๊ณ์ฐ์ ์ด์ด๊ฐ๋๋ฐ๋ ์์์ ์ k
๊ฐ n%k == 0
์ ์ฑ๊ณตํ๋ค๋ฉด k
๋ n์ ์์ธ์์ธ ๊ฒ์ด๋ค.
1๏ธโฃ๋ฒ์ $\sqrt{n}$ ๊น์ง๋ง ๋ฐ๋ณตํ๋ ์ด์ ์ 5๏ธโฃ๋ฒ
$\sqrt{n}$์ดํ์ ์์๊น์ง๋ง ์ค์ผ๋ฌ์ ๊ณฑ ๊ณต์ ์ฐ์ฐ์ ํ๋ ์ด์ ๋ ๋ฌด์์ผ๊น? ๊ทธ ์ด์ ๋ $\sqrt{n}$๋ณด๋ค ํฐ ์์๋ n ์ดํ์์ ์ต๋ ํ๊ฐ๋ง ์กด์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ท๋ฅ๋ฒ์ผ๋ก ์ฆ๋ช
ํ๋ฉด,
์๋ฅผ ๋ค์ด $ \sqrt{n}$๋ณด๋ค ํฐ ์์ธ์๊ฐ $p_1$, $p_2$ ๋ ๊ฐ ์กด์ฌํ๋ค๊ณ ์น์. ๊ทผ๋ฐ ์ด๋๋ฒ๋ฆฌ๋ฉด $p_1 * p_2$ ๊ฐ $ \sqrt{n} * \sqrt{n}$ ๋ณด๋ค ํด ๊ฒ์ด๊ณ , ์ด๋ฌ๋ฉด ์ด๋ฏธ ๋ ์๋ N์ ์์ธ์(N์ ๊ตฌ์ฑํ๋ ์์)๋ผ๋ ์ ์์ ์ด๊ธ๋๊ฒ ๋๋ค.
๋ฐ๋ผ์ $\sqrt{n}$๊น์ง์ ์์๋ง ๊ตฌํ๊ณ , n์ด ์์ง๋ 1๋ณด๋ค ํฐ์ง ํ์ธํด์, ํฌ๋ฉด $\sqrt{n}$๋ณด๋ค ํฐ ์์๊ฐ ํ๋ ์กด์ฌํ๋ ๊ทธ์ ๋ํ ๊ณ์ฐ์ ํด์ฃผ๋ฉด ๋๋ ๊ฒ์ด๋ค.
(4) ์๊ฐ๋ณต์ก๋ ๋ถ์ ๐
์ด ๋ฐฉ์์ ๊ตฌํ์ ์๋ผํ ์คํ ๋ค์ค์ ์ฒด ๊ตฌํ์ ๋ณํ์ผ๋ก ์๋ผํ ์คํ ๋ค์ค์ ์ฒด์ ์๊ฐ๋ณต์ก๋๊ฐ ์์ฃผ ์ ์ฌํ๋ค. ๊ณ ๋ก
$O(N log(log N))$
3. ๊ตฌํ ์ฝ๋ ๐
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
static long N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Long.parseLong(br.readLine());
System.out.println(euler_phi_f(N));
}
public static long euler_phi_f(long n){
if(n == 1) return 1;
long ans = n;
for(long p = 2; p <= Math.sqrt(n); p++){
if(n%p == 0) ans = ans - (ans/p);
while (n%p == 0) n /= p;
}
if(n > 1) { // n์ ์ ๊ณฑ๊ทผ๋ณด๋ค ํฐ ์์๋ ์ต๋ ํ๋๋ง ์กด์ฌํ๋ค.
ans = ans - ans/n;
}
return ans;
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
์ค์ผ๋ฌ์ ํผ ํจ์๋ฅผ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ๋ฐฐ์ ๋ค.