码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1868 Consecutive sum

时间:2015-04-08 18:17:35      阅读:116      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!