题目描述

给出一个正整数N和长度L,找出一段长度大于等于L的连续非负整数,他们的和恰好为N。答案可能有多个,我我们需要找出长度最小的那个。
例如 N = 18 L = 2:
5 + 6 + 7 = 18
3 + 4 + 5 + 6 = 18
都是满足要求的,但是我们输出更短的 5 6 7

输入描述

输入数据包括一行: 两个正整数N(1 ≤ N ≤ 1000000000),L(2 ≤ L ≤ 100)

输出描述

从小到大输出这段连续非负整数,以空格分隔,行末无空格。如果没有这样的序列或者找出的序列长度大于100,则输出No

分析

我们假设过程X可以解决该问题.

接下来就是将X拆解.拆解如下

  • 过程X1解决当N可以被L整除的情况
  • 过程X2解决当N不可以被L整除的情况

然后着眼于X1的拆解,我们拆解如下

  • 过程X11解决当L为奇数的情况,这时候显然可以直接获得答案
  • 过程X12解决当L为偶数的情况,这时候过程较为复杂,初步策略为让L加1,然后交给X处理

过程X2的拆解如下

  • 提前判断该序列是否可满足条件.
  • 让L加1,交由X1处理.

做了一遍,发现X12的逻辑是有问题的.

修正为:当L为偶数,而N%L为奇数时,也是不难得到答案的.

个人感觉算法有问题,尝试一下其他思路.

假设过程Y可以解决该问题,初步将其拆解为:

  • 过程Y1判断N是否可以被L个连续数字和表示
  • 过程Y2判断N是否可以被L到100中的任一个数字个连续数字和表示

过程Y1可以拆解为:

  • 过程Y11: 返回个数为L,中位数为M的序列和
  • 过程Y12: 假设M为N//L,用Y2处理M和L,返回结果和N进行比较
  • 过程Y13: Y12结果为大于,则降低M的值再用Y11处理,直至小于或等于,如果时小于则返回None
  • 过程Y14: Y12结果为小于,则降低M的值再用Y11处理,直至大于或等于,如果大于则返回None

过程Y1可以拆解为:

Y2的话直接从L遍历即可.


我很好奇