「連續整數的和」問題 51nod 1138題

2021-10-04 08:59:18 字數 835 閱讀 2915

問題描述

給出乙個正整數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

47

解題思路

因為這一題的資料量過大,如果用正常的思路去解題,就很可能超時。所以這裡最好對迴圈的範圍有一定的限制。

n=(a1+an)*n/2

在上式中,n表示整數和,a1表示連續數字的首項,an表示連續數字的末項(也是第n項),n表示項數。顯然這是乙個等差數列求和公式,並且將an=a1 + n - 1代入上式中,有:n=(2*a1+n-1)*n/2。顯然,n的取值範圍是[2, sqrt(2*n)]。同時這一題裡面可以只對n進行迴圈,因為對於同乙個n,如果存在對應的整數a1,那麼a1必然是唯一的。所以不用對a1進行迴圈。

#include

#include

#include

using

namespace std;

intmain()

}if(!flag) cout <<

"no solution"

<< endl;

return0;

}

連續整數的和 51Nod 1138

給出乙個正整數n,將n寫為若干個連續數字和的形式 長度 2 例如n 15,可以寫為1 2 3 4 5,也可以寫為4 5 6,或7 8。如果不能寫為若干個連續整數的和,則輸出no solution。input輸入1個數n 3 n 10 9 output輸出連續整數中的第1個數,如果有多個按照遞增序排列...

51nod 1138 連續整數的和

給出乙個正整數n,將n寫為若干個連續數字和的形式 長度 2 例如n 15,可以寫為1 2 3 4 5,也可以寫為4 5 6,或7 8。如果不能寫為若干個連續整數的和,則輸出no solution。input 輸入1個數n 3 n 10 9 output 輸出連續整數中的第1個數,如果有多個按照遞增序...

51Nod 1138 連續整數的和

給出乙個正整數n 3 n 10 9 將n寫為若干個連續數字和的形式 長度 2 例如n 15,可以寫為1 2 3 4 5,也可以寫為4 5 6,或7 8。如果不能寫為若干個連續整數的和,則輸出no solution。假設n a a k 那麼n a k k k 1 2 a和k都是未知,假如我們遍歷a,k...