(백준) Sequence의 합(C++)

지름길: https://www.acmicpc.net/problem/1024

문제

N과 L이 주어지면 합이 N이고 길이가 L 이상인 음이 아닌 정수의 가장 짧은 연속 목록을 찾는 프로그램을 작성하십시오.

기입

N과 L은 첫 줄에 주어집니다.
N은 1,000,000,000 이하의 자연수이고, L은 2 이상 100 이하의 자연수이다.

누르다

목록의 길이가 100보다 작거나 같으면 일련 번호가 첫 번째 줄에 공백으로 구분되어 인쇄됩니다.
길이가 100보다 크거나 그러한 시퀀스가 ​​없으면 -1을 반환합니다.


설명

N을 수열의 합으로 나타내기 위해서는 L이 짝수일 때와 홀수일 때를 판단해야 합니다.

먼저 L이 짝수이면 수열의 합은 a, a+1 / a, a+1 / a+2 / a + 3으로 나타납니다.
N을 L로 나누면 소수점은 정확히 5입니다.
합계로 사용할 수 있습니다.

예를 들어 17을 2런의 합으로 표현하면 17/2 = 8.5이므로 8 또는 9로 표현할 수 있고, 30을 4런의 합으로 표현하면 6.7로 표현할 수 있다.
30/4는 7.5를 의미할 수 있으므로 8 또는 9

다음으로 L이 3보다 큰 홀수이면 수열의 합은 a-1, a, a+1 / a-2, a-1, a, a+1, a+2로 나타나며, 각 시퀀스는 3a/5a입니다.
따라서 N을 L로 나누고 나머지가 0이면 수열의 합으로 나타낼 수 있다.

예를 들어 21을 세 수의 합으로 나타내면 21/3의 나머지는 0이므로 6, 7, 8로 나타낼 수 있다.

암호

#include <iostream>
using namespace std;

int main(){
    int N, L, answer = -1;
    cin >> N >> L;

    int i = L;
    
    while(i <= 100){
        if (i % 2 == 0){ // i가 짝수일 때는 N을 i로 나누었을 때 소수점 부분이 X.5가 되면 수열로 나타낼 수 있다.
double tmp = double(N) / i; if (tmp !
= int(tmp) && tmp * 2 == int(tmp * 2)){ // tmp의 값은 정수가 아니면서 tmp * 2의 값은 정수인지 확인 answer = int(tmp) - (i / 2) + 1; break; } } else{ // i가 홀수일 때는 N이 i로 나누어 떨어졌을 때 수열로 나타낼 수 있다.
if (N % i == 0){ answer = N / i - (i / 2); break; } } i++; } if (answer < 0){ // answer이 음수일 경우에는 조건에 맞지 않고 더 이상 양수로 이루어진 수열을 구할 수 없다.
cout << -1; return 0; } for (int j = 0; j < i; j++){ cout << answer << " "; answer++; } cout << endl; }