刚拿到题目,想的是用目标和N去逐个除以L(L逐渐递增),因为是连续的正整数,因此可以通过整除的方式找到序列的中位数。如果是L是偶数,其中位数如果是几点五,那么往前后分别找L/2个数即可;如果L是奇数,那么中位数是整数,分别往前后找L/2-1个数;其余情况长度L需要自增。

题解:是通过递增数列的递推公式来处理的,通过公式求出首项。以下是Java和python的解法:

import java.util.Scanner;

public class Main{
    public static void solution(int N, int L){
        // 连续非负整数,长度尽可能短,所有数之和位N
        int i = L;
        while ( i <= 100){
            if ((2 * N - i*(i - 1)) % (2 * i)==0){
                int a1 = (2 * N - i*(i - 1)) / (2 * i);
                for (int j = 0; j < i-1; j++){
                    System.out.print(a1+" ");
                    a1++;
                }
                System.out.println(a1);
                break;
            }
            i++; // 不能整除,长度加1
        }
        if(i>100)
            System.out.println("No");
        return;
    }
    public static void main(String[] args){
        Scanner s = new Scanner(System.in);
        int N = s.nextInt();
        int L = s.nextInt();
        solution(N,L);
    }
}
import math

N, L = map(int, input().split())
i = L
while i <= 100:
    a = (2 * N - i*(i - 1)) / (2 * i)
    if math.ceil(a) == a:
        for j in range(i- 1):
            print(int(a), end=" ")
            a += 1
        print(int(a))
        break
    i += 1
if i == 101:
    print("No")