题目描述
对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M。
例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解。
输入输出格式
输入格式:
包含一个整数的单独一行给出M的值(10 <= M <= 2,000,000)。
输出格式:
每行两个自然数,给出一个满足条件的连续自然数段中的第一个数和最后一个数,两数之间用一个空格隔开,所有输出行的第一个按从小到大的升序排列,对于给定的输入数据,保证至少有一个解。
思路
等差数列公式:
第n项的值an=首项+(项数-1)×公差
an=am+(n-m)d ,若已知某一项am,可列出与d有关的式子求解an
等差数列公式是本题的关键,避免了繁琐的暴力枚举。
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int i,s,s1,s2,n;
scanf("%d",&n);
n=n*2;//避免奇数情况,乘2
for(i=n/4;i>1;i--)//所以i=i/4
{
if(n%i==0)//如果n能整除于变量i
{
s=n/i;
s1=(s-i+1)/2;
s2=(s+i-1)/2;
if(s-i+1>0&&s1+s2==s)//等差数列公式的变体,枚举+判断
{
printf("%d %d\n",s1,s2);
}
}
}
return 0;
}