您的位置:首页 > 其它

UVa 11526 H(n) (数论)

2013-10-19 21:39 357 查看


11526-H(n)

Timelimit:5.000seconds

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2521

WhatisthevaluethissimpleC++functionwillreturn?



longlongH(intn){

longlongres=0;

for(inti=1;i<=n;i=i+1){

res=(res+n/i);

}

returnres;

}

Input

ThefirstlineofinputisanintegerT(T<=1000)thatindicatesthenumberoftestcases.EachofthenextTlinewillcontainasinglesigned32bitintegern.

Output

Foreachtestcase,outputwillbeasinglelinecontainingH(n).



SampleInputOutputforSampleInput

2

5

10

10

27
怎么计算sum{[n/i]}?(1<=i<=n)(n<=2147483647)

n太大,硬算肯定不行,我们先观察一个例子,看能否得出一些结论。

当n=20时,和式展开为

20+10+6+5+4+3+2+2+2+2+1+1+1+1+1+1+1+1+1+1

注意到后面相同的数太多,不妨化简下:

20+10+6+5+1*(20-10)+2*(10-6)+3*(6-5)+4*(5-4)

=(20+10+6+5)+(20+10+6+5)-4*4

=2(20+10+6+5)-4*4

也许,我们可以



这样,复杂度就从O(n)降为O(√n)了。

完整代码:

/*0.206s*/

#include<cstdio>
#include<cmath>
typedeflonglongll;

inlinellans(lln)
{
llr=0,m=sqrt(n),i;
for(i=1;i<=m;++i)r+=n/i;
return(r<<1)-m*m;
}

intmain()
{
intt;
lln;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
printf("%lld\n",ans(n));
}
return0;
}

转载请注明:/article/2674183.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: