我用的是滑动窗口。
注意有一个大坑就是当整个窗口的和满足条件sum = N,但是整个窗口的长度大于100了,这时如果左边界为0,是可以将左边界往右移动一步的。
代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <cmath>
#include <climits>
using namespace std;
int main () {
    int N, L;
    scanf("%d%d", &N, &L);
    int left = 0, right = 0, limit = N / 2, sum = 0;
    int start = 0, end = INT_MAX, len = INT_MAX;
    while (right <= limit) {
        sum += right;
        right++;
        while (sum > N) {
            sum -= left;
            left++;
        }
        if (sum == N) {
            if (len > right - left && (right - left) >= L) {
                start = left;
                end = right;
                len = right - left;
            }
        }
    }
    if (len > 100 && start == 0) {
        start += 1;
        len = 100;
    }
    if (len > 100 || len < L) {
        printf("No\n");
    } else {
        for (int i = start; i < end - 1; i++) {
            printf("%d ", i);
        }
        printf("%d\n", end - 1);
    }
    return 0;
}