首页 > 其他 > 详细

hdu 1868 Consecutive sum

时间:2015-04-08 18:15:56      阅读:106      评论:0      收藏:0      [点我收藏+]

我们假设成立数列的首相和末项分别为a和b, 由求和公式可得(a+b)*(b-a-1)/2==n;再设a+b=x,b-a+1=y,则有方程组 x*y=n*2, 两式相加得x+y=2*b+1,故有x+(2*n/x)=2*a-1

因此我们只要检测能被2*n整除且使上面方程满足中a为正整数的情况(b比a大,b就不用判断了),由于3*5与5*3是同一种情况,所以只需要从1循环到sqrt(n) ,889ms险过

 

#include<iostream>
#include<cmath> 
using namespace std;
int main()
{
	long long n;
	cin.sync_with_stdio(false);
	while(cin>>n)
	{
		n*=2;
		int re=0;
		for(long long i=1;i<=sqrt(n);i++)
		{
			if(n%i==0&&(i+n/i)%2==1)
			{
				re++;
			}
		}
		cout<<re-1<<endl;
	}
	return 0;
} 

hdu 1868 Consecutive sum

原文:http://blog.csdn.net/zafkiel_nightmare/article/details/44942227

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!