牛客網序列和

題目表述:

給出一個正整數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=(a1+(L1)+a1)×L2N={(a_1+(L-1)+a_1)\times L \over 2},變換可得這段連續非負整數的首項爲a1=2NL2+L2La_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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章