序列和

Posted by Liao on 2020-04-24

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

Sn = (a1 + an) * n / 2 = N

​ [a1+a1+(n-1)*d] * n = 2N

​ a1 = (2N-n^2+n)/2

由连续的非负整数可知这一串数字是差为1的等差数列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
using namespace std;
int main(){
int n,l;
cin >> n >> l;
bool flag = false;
for(int i = l; i <= 100; i++){
if((2 * n + i - i * i) % (2 * i) == 0){
flag = true;
int a1 = (2 * n + i - i * i) / (2 * i);
if(a1 < 0)
continue;
for(int j = 0; j < i - 1; j++){
int a = a1 + j;
cout << a << " ";
}
cout << a1 + i - 1 << endl;
break;
}
}
if(flag == false)
cout << "No" << endl;

}