问题分析:设左边界为a,右边界为b,则不难得到(b-a+1)(b+a)/2=M(等差数列求和公式),而且很明显,b+a > b-a+1, 所以只需要枚举2M的因子,小的因子为b-a+1,大的即为b+a,然后就是解一个二元一次方程组就行了!!!
代码分析:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int m, x, i;
double p, q;
cin >> m;
x = sqrt(2 * m);//枚举边界,不可能两个因子都比边界大吧……
for(i = x; i > 1; i--)
{
p = 1.0*(i-i*i+2*m)/(2*i);//即为a
q = 1.0*(i*i-i+2*m)/(2*i);//即为b
if((int)p == p && (int)q == q)//如果是整数因子就满足条件输出即可
{
printf("%.0f %.0f\n", p, q);
}
}
}