#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
/*
求解 n/1+n/2+n/3+……n/n; 例如
if(n==10) ans=10+5+3+2+2+1+1+1+1+1
i=1 n/1=10 后面5个1的和 (n/1-n/2)*1
i=2 n/2=5 后面2个2的值 (n/2-n/3)*2
……
计算前面一部分和的时候可以同时累加后面的数,处理到sqrt(n)即可
*/
int main()
{
int T,kase=1,n;
ll ans;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int m=sqrt(n);
ans=0;
for(int i=1;i<=m;i++)
{
ans+=n/i;//累加当前的数
ans+=(n/i-n/(i+1))*i;//累加后面的数
}
if(n/m==m) ans-=m;//重复累加的数
printf("Case %d: %lld\n",kase++,ans);
}
return 0;
}
LightOJ - 1245 Harmonic Number (II)
最新推荐文章于 2018-08-24 01:05:09 发布