牛客网序列和

题目表述:

给出一个正整数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

题意:输出一段连续的非负整数,其和等于N并且是不唯一答案中长度最小的。

由连续的非负整数可知这一串数字是差为1的等差数列,其和为 N = ( a 1 + ( L 1 ) + a 1 ) × L 2 N={(a_1+(L-1)+a_1)\times L \over 2} ,变换可得这段连续非负整数的首项为 a 1 = 2 N L 2 + L 2 L a_1={2N-L^2+L \over2L} 。L从给定初值遍历到100便可找到这段连续非负整数的首项且满足长度最小。

#include<iostream>
using namespace std;
int main(void)
{
    int n,l;
    cin>>n>>l;
    int start,end,flag = 0;
    for(int i = l;i <=100;i++)
    {
        if((2*n-i*i+i)%(2*i) == 0)
        {
            start = (2*n-(i*i)+i)/(2*i);
            flag = 1;
            end = i;
            break;
        }
    }
    if(flag)
    {
         for(int i = 0;i < end-1;i++)
            cout<<start+i<<" ";
         cout<<start+end-1<<endl;
    }
    else cout<<"No"<<endl;
    return 0;
}
发布了31 篇原创文章 · 获赞 4 · 访问量 936

猜你喜欢

转载自blog.csdn.net/qq_39781096/article/details/104979564