17425.py

tyghu77·2022년 1월 19일
0

BOJ

목록 보기
3/3

17427에서 g(N)을 구할 때, O(N)만에 가능한 것을 알게되었다.

그런데 이 문제에서는 테스트 케이스가 100000개 주어진다.
테스트 케이스가 주어질 때는 변하지 않는 값은 케이스마다 계산해서 출력하지 말고, 전체 경우를 모두 계산한 후, 출력을 모아서 해주는 것이 좋다.

//pypy3
import sys
MAX = 1000001

f = [1] * MAX
g = [0] * MAX
for i in range(2, MAX):
    j = 1
    while i*j < MAX:
        f[i * j] += i
        j += 1

for i in range(1, MAX):
    g[i] = g[i - 1] + f[i]

answer = []
n = int(sys.stdin.readline().rstrip())
for i in range(n):
    m = int(sys.stdin.readline().rstrip())
    answer.append(g[m])

print('\n'.join(map(str, answer)) + '\n')

f[i]를 더 빨리 구하기 위해서 배수를 사용했다.
(a를 약수로 갖는 수는 a의 배수)
예를들어 2를 약수로 갖는 수는 2, 4, 6, ... 이므로
f[2], f[4]. f[6], ... 에 2를 더해준다.

그리고 g[i]는 f의 누적합이므로 g[i] = g[i - 1] + f[i]로 구할 수 있다.

profile
배운것을 기록하자

0개의 댓글