杭电ACM 2058 The sum problem

http://acm.hdu.edu.cn/showproblem.php?pid=2058

穷举,但不能从老老实实从一开始一个一个的穷举,一定要利用好公式,否则会时间超出限制

i是开头,j是数字的个数。

(i+i+j-1)*j/2=m

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	int N,M;
	while(cin>>N>>M&&N||M)
	{
		int i,j;
		
		for(j=(int)sqrt((double)(2*M));j>=1;j--){
			i=(2*M/j+1-j)/2;;
			if((2*i+j-1)*j/2==M) 
					cout<<'['<<i<<','<<i+j-1<<']'<<endl;				
			}		
		cout<<endl;
		
	}
	return 0;
}


你可能感兴趣的:(杭电ACM 2058 The sum problem)