51nod 1138 連續整數的和 牛逼

2021-08-09 22:31:00 字數 949 閱讀 4853

1138 連續整數的和

基準時間限制:1 秒 空間限制:131072 kb 分值: 10 

難度:2級演算法題

給出乙個正整數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個數,如果有多個按照遞增序排列,如果不能分解為若干個連續整數的和,則輸出no solution。
input示例

15
output示例

1

47

思路:

根據所學的等差數列和公式  sn=a1*n+n(n-1)*d/2;

這裡所連續,所以可以公式轉變為 : 

(1)公式演變第一步:sn=a*n+n*(n-1)/2;

(2)公式演變第二步:a=(sn-n*(n-1)/2)/n;

據題意,我們只要求a(a為整數),那麼下一步思路為遍歷n,判斷一下(sn-n*(n-1)/2)%n,那麼問題來了,n遍歷到多少足夠停止??

那麼回到公式(1) 轉變一下 :2*sn

==(2a+n-1)*n ,因為a>=1,所以 2a-1>1,所以 (2a+n-1)*n>n^2;

2*sn==n^2---->也就是說n只要遍歷到sqrt(2*sn)就可以,因為超過了n那麼就已經n^2超過2*sn 

直接上**:

#include #include #include #include typedef long long ll;

int main()

}if(flag)

}return 0;

}

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...

51nod 1138 連續整數的和

萌新第一次發文 進入正題啦.此題最容易想到的就是利用等差數列的通項公式sum n a1 an 2 n a1 a1 n 1 2,此時公差d為1。將次方程做一些變換,a1 sum 1 2 n 2 n n,從n 2開始遍歷,所找到的a1即為解。這裡的難點是遍歷n的範圍,因為a1 1,所以a1 ai n 1...