HDOJ HDU 2058 The sum problem ACM 2058 IN HDU

//MiYu原创, 转帖请注明 : 转载自 ______________白白の屋

题目地址 :
         http://acm.hdu.edu.cn/showproblem.php?pid=2058

观察a+1,a+2…a+d
全部相加等于M
即(a+1+a+d)*d/2 = M, 
这里d是平方,我们可以从长度d入手,这样就能把范围由M转换成M^1/2 ;

这里把代码中的①和②解释下:
①:当a+1,a+2…a+3相加等于M时,即
(a+1+a+d)*d/2 = M
而a最小是0,所以(d+1)*d/2=M时d去最大值,就是这步把时间复杂度减小的。
d就是sqrt(2*M)

②:(a+1+a+d)*d/2 = M
所以a*d + (d+1)/2 = M
所以要使等式成立,M-(d+1)/2必须是d的倍数。
此为奋斗哥的代码 :    0rz........下

//MiYu原创, 转帖请注明 : 转载自 ______________白白の屋

#include 
< iostream >
#include 
< cmath >
#include 
< algorithm >
using   namespace  std;
int  N, M;
int  main()
{
    
int  flag  =   0 ;
    
while (scanf( " %d %d " & N,  & M)  &&  (M || N))
    {
        
int  i;
        
int  len  =   int (sqrt(M * 2.0 ));   //  ①
         for (i = len; i >= 1 -- i)
        {
            
int  temp  =  M - (i * i + i) / 2 ;    //  ②
             if (temp % ==   0 )
                printf(
" [%d,%d]\n " , temp / i + 1 , temp / i + i);
        }
        printf(
" \n " );
    }
    
return   0 ;
}

转载于:https://www.cnblogs.com/MiYu/archive/2010/08/18/1802416.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值