写在前面的话
一道数学题。
题目
题目描述
对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M。例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解。
输入输出格式
输入格式:
包含一个整数的单独一行给出M的值(10 <= M <= 2,000,000)。输出格式:
每行两个自然数,给出一个满足条件的连续自然数段中的第一个数和最后一个数,两数之间用一个空格隔开,所有输出行的第一个按从小到大的升序排列,对于给定的输入数据,保证至少有一个解。输入输出样例
输入样例
10000输出样例
18 142297 328
388 412
1998 2002
分析
数学题。
我们知道,一段等差数列的求和方法是:
(首项+末项)*项数/2。
所以,对2*m进行拆分。
会拆除很多情况。
当然不会那么多。
如果一奇一偶,没问题。
1.奇数为和,偶数为项数。那么首项末项一个奇一个偶,项数偶数没问题。
2.反过来,同理,没问题。
如果全奇数或全偶数
1.全奇数,首项末项只能一奇一偶,项数必不为奇。
2.全偶数,道理类似全奇数。
然后得到的俩数(注意不能一样)计算之后就可以输出了。
上代码(一如既往的奇丑码风)
#include <bits/stdc++.h>
using std::cin;
using std::cout;
using std::endl;
int main()
{
int m;
cin >> m;
for(int k1 = sqrt(2*m); k1 > 1; k1--)
if(2 * m % k1 == 0 && (k1 + 2 *m / k1) % 2)
{
int k2 = 2 * m / k1;
cout << (k2 - k1 + 1) / 2 << " " << (k1 + k2 - 1) / 2 << endl;
}
return 0;
}