题意
给出一个正整数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最小是2,那么a的遍历范围为(1<=a<=10^8),假设我们遍历k,由
n>k∗(k−1)2
得
k<n√
,也就是k的遍历范围为(2<=k<=10^4.5)。
所以,我们从2开始遍历k,当
n−k∗(k−1)2
是k的倍数时,a的值是一个解。
参考代码
#include <iostream>
#include <math.h>
using namespace std;
int ans[100000];
int main(){
int n;
while (cin>>n){
int k=0;
for (int i=2;i*(i-1)/2<n;i++){
if ((n-i*(i-1)/2)%i==0)
ans[k++]=(n-i*(i-1)/2)/i;
}
if (!k) cout<<"No Solution"<<endl;
else
for (int i=k-1;i>=0;i--) cout<<ans[i]<<endl;
}
return 0;
}