Search

BOJ 1024 수열의 합

태그
수학

문제 설명

NNLL이 주어질 때, 합이 NN이면서, 길이가 적어도 LL인 가장 짧은 연속된 음이 아닌 정수 리스트를 구하는 문제

예제 입력/출력

입력1
18 2
Plain Text
복사
출력1
5 6 7
Plain Text
복사

제약 조건

0<N1,000,000,0000 < N ≤ 1,000,000,000
2L1002 ≤ L ≤ 100

문제 풀이

접근 등차수열의 합 공식 활용 - O(1)O(1)
이 문제를 해결하기 위한 핵심 아이디어는 등차수열의 합 공식을 활용하는 것
연속된 L개의 수열의 합은 다음과 같이 표현할 수 있다.
N=(x+1)+(x+2)++(x+L)N = (x+1) + (x+2) + … + (x+L)
=Lx+(1+2++L)= Lx + (1+2+…+L)
=Lx+L(L+1)/2= Lx + L(L+1) / 2
위 식을 x에 대해 정리하면 다음과 같다.
x=N/L(L+1)/2x = N / L - (L + 1) / 2
유효한 x의 조건은 다음과 같다.
1.
x는 정수x는 \ 정수
x가 정수여야 올바른 연속된 음이 아닌 정수 리스트가 나온다.
2.
x+10x + 1 ≥ 0
문제에서 음이 아닌 정수 리스트라 했기 때문에 첫항인 x + 1은 0보다 크거나 같아야한다.

풀이 코드

N, L = map(int, input().split()) for i in range(L, 101): x = N / i - (i + 1) / 2 if int(x) == x: # x는 정수여야 한다. x = int(x) if x + 1 >= 0: # 첫항(x+1)은 0보다 크거나 같아야한다. for j in range(x + 1, x + i + 1): print(j, end=" ") break else: print(-1)
Python
복사

참고 자료