51Nod 1138 連續整數的和(等差數列)
阿新 • • 發佈:2018-11-11
給出一個正整數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; }