题目描述
对一个给定的自然数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; }