[洛谷]P1147 连续自然数和

题目描述

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

猜你喜欢

转载自blog.csdn.net/apro1066/article/details/80358270