상상쓰

[백준] 쉽게 푸는 문제 본문

Coding Test

[백준] 쉽게 푸는 문제

상상쓰 2021. 9. 23. 10:28

https://www.acmicpc.net/problem/1292

 

1292번: 쉽게 푸는 문제

첫째 줄에 구간의 시작과 끝을 나타내는 정수 A, B(1 ≤ A ≤ B ≤ 1,000)가 주어진다. 즉, 수열에서 A번째 숫자부터 B번째 숫자까지 합을 구하면 된다.

www.acmicpc.net

 

군수열 문제로 수열 공식을 이용하여 답을 구할 수 있다.

 

i 번째에 해당하는 숫자 찾기(계차수열, 근의 공식)

x = (1 + math.sqrt(1 + 8 * (i - 1))) // 2

 

i 번째에 해당하는 숫자가 처음으로 등장하는 번호 찾기(계차수열)

n = 1 + (x - 1) * x // 2

 

i 번째에 해당하는 숫자까지의 합(n - 1 번째까지의 합 + n 번째부터 i 번째까지의 합)

n - 1 이 x 라면,

1^2 + 2^2 + 3^2 + ... + x^2

+

(i - n + 1) * x

 

import sys, math

def sequenceSum(i):
    if i == 0:
        return i
    else:
        x = int((1 + math.sqrt(1 + 8 * (i - 1))) // 2)
        n = int(1 + ((x - 1) * x // 2))
    
        return int((x - 1) * x * (2 * x - 1) // 6) + (i - n + 1) * x
    
A, B = map(int, sys.stdin.readilne().split())

print(sequenceSum(B) - sequenceSum(A-1))
Comments