업데이트:

문제 링크

백준 17427번 - 약수의 합 2 (Silver 2)

문제 설명

f(a) : a의 약수의 합
g(a) : f(1), …, f(a)의 합
N이 주어졌을 때 g(N)을 계산하는 문제(N < 1000000)

주의점

  • overflow에 주의해야한다.
    • $g(N) = O(N^2)$, $g(1000000) \approx 2^{40}$ : int의 범위를 넘는다.

정답 코드 및 설명

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.io.*;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    int N = Integer.parseInt(br.readLine());
        bw.write(""+g(N));
        bw.close();
  }
    
  static long g(int N) {
    long g = 0;
      for(int i = 1; i <= N; i++)
        g += N / i * i;
      return g;
  }
}
  • $g(N) = \displaystyle \sum_{i=1}^{N} f(i) = \sum_{i=1}^{N} \sum_{j | i} j$
    • 역으로 생각하기 : $i$는 $\lfloor N / i\rfloor$번씩 더해진다.
    • $g(N) = \displaystyle \sum_{i=1}^{N} i \times \lfloor N / i \rfloor$
  • g(N)이 int의 범위를 벗어날 수 있으므로, long으로 구현한다.
  • 시간 복잡도 : $O(N)$

댓글남기기