17427.py

tyghu77·2022년 1월 18일
0

BOJ

목록 보기
2/3
import sys

n = int(sys.stdin.readline().rstrip())
answer = 0
for i in range(1, n+1):
    answer += i*(n//i)

print(answer)

1 부터 N 까지 약수를 구하는 것은 O(N)(빨라도 루트N)
f(A) : A의 모든 약수의 합
g(N) : 1 부터 N 까지 f(A)를 더한 값
주어진 N은 1000000
시간은 0.5초
O(N^2)(약수 구하기 * 더하기)으로 문제를 풀 수가 없으므로, 다른 접근 방식이 필요하다.

답은 배수를 이용하는 것이었다.
a를 약수로 가지는 수는 a의 배수이다.

N이 7이라고 할 때 (1~7)
1을 약수로 가지는 수는 7개이다. 7//1
2를 약수로 가지는 수는 3개이다. 7//2
...

1 2 3 4 5 6 7
1 1 1 1 1 1 1
  2   2   2
    3     3
      4
        5
          6
            7

해당 약수를 가지는 수 * 해당 약수를 해서 모두 더해주면 g(N)을 찾을 수 있다.

profile
배운것을 기록하자

0개의 댓글