#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n;
int main(){
scanf("%d",&n);
int flag=0;
int m=(int)sqrt(n);
for(int i=2*m;i>=2;i--){
if((2*n-i*(i-1))%(2*i)==0&&2*n-i*(i-1)>0){
flag=1;
printf("%d\n",(2*n-i*(i-1))/(2*i));
}
}
if(!flag)printf("No Solution");
return 0;
}
爆搜tle,百度了以后发现是个挺基础的数学知识。
枚举连续整数的个数,利用等差数列求和反解出第一个数字,判断一下
2*n-i*(i-1))%(2*i)==0&&2*n-i*(i-1)>0 是否成立就是有解的条件。
枚举范围是从2*sqrt(n)到2,2很好说,但是不知道为什么是2*sqrt(n)。