挺有趣的一道题。
求出前sqrt(n)项和:即n/1+n/2+…+n/sqrt(n)
而(n/1-n/2)就是后面项中1.x的个数
(n/2-n/3)就是后面项中2.x的个数
依次类推。。。
举两个例子:
n/1-n/2 = 5; 1.x
n/2-n/3 = 2 2.x
n/3-n/4 = 1 3.x <----- 重复,要减掉
n/1-n/2 = 10 1
n/2-n/3 = 4 2
n/3-n/4 = 1 3
n/4-n/5 = 1 4
由于n/sqrt(n) != sqrt(n)
故不存在重复的问题。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t,cnt=0;
scanf("%d", &t);
while(t--) {
ll n;
scanf("%lld", &n);
ll ans=0;
ll x=sqrt(n);
for(ll i=1; i<=x; i++) {
ans+=(n/i);
ans+=(n/i-n/(i+1))*i;
}
if(n/x==x) {
ans-=x;
}
printf("Case %d: %lld\n",++cnt, ans);
}
return 0;
}
来源:CSDN
作者:19lirongao
链接:https://blog.csdn.net/LIRONGAO0706/article/details/104794157