标签:数组

题目:求解连续数列

已知连续正整数数列{K}=K1,K2,K3...Ki的各个数相加之和为S,i=N (0<S<100000, 0<N<100000), 求此数列K。

  • 输入描述:

输入包含两个参数,1)连续正整数数列和S,2)数列里数的个数N。

  • 输出描述:

如果有解输出数列K,如果无解输出-1

示例1

输入

525 6

输出

85 86 87 88 89 90

示例2

输入

3 5

输出

-1

题解

思路:

  1. 先对和S、个数N求平均数,可初步锁定连续正整数数列的范围在[平均数-N, 平均数+N]之间(实际上还可以再缩小一倍的遍历次数)
  2. 定义sum_temp()方法进行求和。依次从范围选择N个整数,判断和是否与S相等,不相等则继续后移N个数的索引位置
  3. 如果存在相等的整数组合,则返回正整数数列
  4. 如果找不到相等的整数组合,则返回-1
mport math
import sys


for line in sys.stdin:
    sums = line.split()[0]
    nums = line.split()[1]
    # math.ceil()向下取整
    end = math.ceil(int(sums)/int(nums))
    start = end - int(nums)
    max_num = end + int(nums)

    def sum_temp(x, y):
        z = 0
        for i in range(x, y):
            z = z + i
        return z

    while True:
        temp = sum_temp(start, end)

        if start < 0 or end >= max_num or temp > int(sums):
            print(-1)
            break

        if temp == int(sums):
            for num in range(start, end):
                print(num, end=" ")
            break
        else:
            start = start + 1
            end = end + 1