1. 程式人生 > >51Nod 1138 連續整數的和(等差數列)

51Nod 1138 連續整數的和(等差數列)

給出一個正整數N,將N寫為若干個連續數字和的形式(長度 >= 2)。例如N = 15,可以寫為1 + 2 + 3 + 4 + 5,也可以寫為4 + 5 + 6,或7 + 8。如果不能寫為若干個連續整數的和,則輸出No Solution。

收起

輸入

輸入1個數N(3 <= N <= 10^9)。

輸出

輸出連續整數中的第1個數,如果有多個按照遞增序排列,如果不能分解為若干個連續整數的和,則輸出No Solution。

輸入樣例

15

輸出樣例

1
4
7

 看了網上的題解才會的。。。

設求的數為S,符合條件的第一項為a,一共有n項。

因為是連續的,所以很容易想到公比為1。

所以可寫成:

a+(a+1)+(a+2)+(a+3)+....+(a+n-1)=S;

化簡得:

na+n*(n-1)/2=S;

a=(2*S-n*(n-1))/(2*n);

所以只需要通過列舉n來帶入式子,看看得出的結果是否為整數。

要想列舉n的話還需要知道n的範圍。

所以我們還需要單獨求n,

將上面的式子轉化為:
n*(n-1)=2*S-2na;

則n的範圍近似是sqrt(2*S);

所以可以通過如上方法求解了。

程式碼如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <math.h>
using namespace std;
int n;
int main()
{
    scanf("%d",&n);
    int m=(int)sqrt(2*n);
    int flag=0;
    for (int i=m;i>=2;i--)
    {
        if((2*n-i*(i-1))%(2*i)==0)
        {
            printf("%d\n",(2*n-i*(i-1))/(2*i));
            flag=1;
        }
    }
    if(!flag)
    {
        printf("No Solution\n");
    }
    return 0;
}