牛客网序列和

题目表述:

给出一个正整数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} N=2(a1+(L1)+a1)×L,变换可得这段连续非负整数的首项为 a 1 = 2 N − L 2 + L 2 L a_1={2N-L^2+L \over2L} a1=2L2NL2+L。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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值