본문 바로가기
알고리즘

[BOJ] 백준 1024번: 수열의 합

by 강성주의 알고리즘 2020. 8. 12.

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

 

1024번: 수열의 합

첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다.

www.acmicpc.net

L 이상 100이하 길이의 연속된 수로 구성된 수열의 합이 N을 구하는 문제입니다.

도저히 풀이가 떠오르지 않아 모든 L에 대하여 이분탐색으로 가능한 경우의 수를 탐색했습니다.

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
ll n, l;
int main() {
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin >> n >> l;
	for (ll i = l; i <= 100; i++) {
		ll s = 0, e = 1000000000;
		ll mid;
		ll start = -1;
		while (s <= e) {
			ll mid = (s + e) / 2;
			ll sum = mid * i + (i*i - i) / 2;
			if (sum == n) {
				start = mid;
				break;
			}
			if (sum > n) {
				e = mid - 1;
			}
			else {
				s = mid + 1;
			}
		}
		if (~start) {
			for (ll j = start; j < start + i; j++) {
				cout << j << " ";
			}
			return 0;
		}
	}
	cout << -1;
}
반응형