原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1138
思路:设数列首项为a,长度为n,那么a,n要满足方程,n*(2*i+n-1) = 2*N,然后i不好枚举,我们可以从大到小枚举n,根据方程可知,n是sqrt(2*N)级别
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 50005;
int main() {
int n;
scanf("%d", &n);
int up = sqrt(1LL * 2 * n);
bool flag = true;
for (int i = up; i >= 2; i--) {
double a = (1.0 * n * 2 / i - i + 1) / 2;
if (a == (int)a) {
printf("%d\n", (int)a);
flag = false;
}
}
if (flag)printf("No Solution\n");
return 0;
}