1. ๋ฌธ์ ์ค๋ช ๐
f(n)
= n์ด๋ ์ซ์์ ์ฝ์๋ค์ ํฉg(n)
= 1~n๊น์ง ๊ฐ ์ซ์์ ์ฝ์๋ค์ ํฉ ์ฆ f(1) ~ f(n)์ ํฉ
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
KEY WORD
: ๋์ ํฉ
, ์๊ฐ ๋ณต์ก๋์ ๋ํ ๊ฐ
- f(n)์ ๊ตฌํ๋ค. (1~ 1000000 ๊น์ง ์ ์ฒด ์์ ๋ํด ๊ตฌํ๋ค.)
- ๋ชจ๋ f(n) ๋ฐฐ์ด์ 1๋ก ์ด๊ธฐํ (1์ ๋ฌด์กฐ๊ฑด ์ฝ์์ ํฌํจ๋๋ฏ๋ก)
- f(ij) += i
(i = 2 ~ 1000000๊น์ง ๋ชจ๋ ์ํ, j = 1๋ถํฐ 1์ฉ ์ฆ๊ฐํจ. ์ฆ `ij=
i์ ๋ฐฐ์๋ฅผ ๋ํ๋.`)
- g(n)์ f(n)์ ๋์ ์ผ๋ก ๊ตฌํ๋ค.
- ๋ต์ ์ถ๋ ฅํ๋ค.
f(i*j) = i๋ฅผ ์งํํ๋ฉด, i์ ๋ฐฐ์์๋ i๋ฅผ ๋ฌด์กฐ๊ฑด ๋ํ๊ณ i๊ฐ 1~ 1000000๊น์ง ๋ชจ๋ ์๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์ ๊ฐ ์ซ์๋ง๋ค ์์ ์ ์ฝ์๋ฅผ ๋น ์ง์์ด ๋ํ ์ ์๋ค. ์ฌ๊ธฐ์ ๋ค์์ด ๊ถ๊ธํ ์ ์๋ค.
๐ค ์ด๋ ๊ฒ ๋ฌด์ํ๊ฒ ํ๋ฉด ์๊ฐ ์ด๊ณผ ์๋๋์?
๋๋ ์ด ์๋ฌธ์ด ๋ค์๋ค. ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์๊ฐ์ด๊ณผ๋ ๋์ง ์๋๋ค.
for (int i = 2; i < MAX; i++) {
for (int j = 1; i*j < MAX; j++) {
fn[i*j] += i;
}
}
j๋ MAX/i ๋ฒ ๋ฐ๋ณตํ๋ค. ๋ฐ๋ผ์ 50๋ง, 33๋ง, 25๋ง ... ์ ์ ์ค์ด๋ ๋ค. ์กฐํ ๊ธ์ ํํ์ด๋ค.
์์ ์์์์ 1๋ง 1000000์ผ๋ก ๋ฐ๋ ๊ฒ ๋ฟ์ด๋ค. ์กฐํ๊ธ์๋ k๊ฐ ์ปค์ง์๋ก ์ฆ๊ฐํญ์ด ๊ฐ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ In(n)์ ์๋ ดํ๋ค. ๋ฐ๋ผ์ ์์ ๋ฌธ์ ์์๋ ๊ฒ์ ๋ฐ๋ณต๋ฌธ์ N๋ฒ ๋ฐ๋ณต, ์์ ๋ฐ๋ณต๋ฌธ์ logN๋ฒ ๋ฐ๋ณต์ผ๋ก ์์ ํด๋ ๋๋ค. ์๊ฐ๋ณต์ก๋์ ๊ทผ์ฌ๊ฐ์ ๊ตฌํ๋ฉด
O(N * logN)์ด๋ค. ์ด๋ 10^7 ~ 10^8 ์ฌ์ด์ด๋ค.
์๊ฐ์ด๊ณผ๋ ๋์ง ์๋๋ค.
3. ์ฝ๋ ์๊ฐ ๐
import java.io.*;
import java.util.Arrays;
public class Main {
static int MAX = 1000001;
public static void main(String[] args) throws IOException {
int [] fn = new int [MAX];
Arrays.fill(fn, 1); // ์ด๊ธฐ๊ฐ 1๋ก ์ฑ์ฐ๊ธฐ
long [] gn = new long [MAX];
getFn(fn);
getGn(fn,gn);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringBuilder ans_list = new StringBuilder();
for (int t = 0; t < T; t++) {
ans_list.append(gn[Integer.parseInt(br.readLine())]).append("\n");
}
System.out.println(ans_list);
}
public static void getFn(int [] fn){
for (int i = 2; i < MAX; i++) {
for (int j = 1; i*j < MAX; j++) { // i์ ๋ฐฐ์์๋ i๋ฅผ ๋ํ๋ค. โ i *j๋ผ๋ ์์ ์ฝ์๋ฅผ ๋ํ๋ ๊ฒ
fn[i*j] += i;
}
}
}
public static void getGn(int [] fn, long [] gn){
for (int i = 1; i < gn.length; i++) {
gn[i] = gn[i-1] + fn[i];
}
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
์ฒ์์๋ ์๋ผํ ์คํ
๋ค์ค์ ์ฒด๋ฅผ ํ์ฉํ๋ค.
์์์ธ ๊ฐ์ ์๊ธฐ ์์ ๊ณผ 1๋ง ๋ํ๊ณ , ์๋ ๊ฐ๋ค์ (์์์ ๋ฐฐ์) + (N์ ๋ง๋ค ๋ ํํธ๋(๊ณฑํด์ง๋ ์))๋ก ๊ตฌํ๋ค. ๋ด๊ฐ ๊ฐ๊ณผํ ์ง์ ์ ์ด๋ค ์์์ ๋ฐฐ์ * ์ด๋ค ์์์ ๋ฐฐ์๋ก ์ด๋ฃจ์ด์ง ์ฝ์๋ ๊ณ์ฐ์ ๋ฃ์ง ์์๋ค๋ ๊ฒ์ด๋ค. ํด๋น ์๋ ์์๋ค๋ผ๋ฆฌ์ ์กฐํฉ, ๋ฐฐ์์ ์์ ์์ธ ๊ฒ, ๋ฐฐ์๋ผ๋ฆฌ์ ์กฐํฉ ๋ฑ ๊ฐ์ง์๊ฐ ๋ง์์ ํน์ ํ ์๊ฐ ์์๋ค.
์ด๋ ต๊ฒ ์๊ฐํ๋ค. :cry: ์ฌ์ค i์ ๋ฐฐ์์ ๋ชจ๋ i๋ฅผ ๋ํ๋ค.
๋ ๋ฐ์์ ํ์ง ๋ชปํ ๊ฒ์ด ๋ฌธ์ ์๋ค. ๋๋ A๋ผ๋ ์์ ์์ญ์ ๋ค์ด์ฌ ๊ฐ๋ค์ ์ผ์ผํ ๊ตฌํ๋ค๋ฉด, ์ ๋ต ์ฝ๋๋ ๊ฐ ์ซ์๊ฐ ์์ ์ด ์์ด์ผํ ์๋ฆฌ์ ์ค์ค๋ก ๋ค์ด๊ฐ๋๋ก ํ์๋ค. ๋๋ ๋ชจ๋ ์ผ์ผํ ์๊ฐํด์ผํ๊ฒ ๊ตฌ์ํด์ ๋ฌธ์ ํ์ด๋ฅผ ๋ ์ด๋ ต๊ฒ ๋ง๋ ๊ฒ ๊ฐ๋ค. ๋ค์์ ๋ค์ ํ์ด๋ณด๊ฒ ๋ค.