算是一个找规律的题目吧。 枚举前sqrt(n)个数,数i出现的次数为n/i-n/(i+1),对答案的贡献为(n/i-n/(i+1))*i。
对于sqrt后边的数,可以直接由n/i获得,并且一定只出现一次。
(数学果然博大精深~~~~)
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve(ll time){
ll n;
cin>>n;
ll ans=0;
ll c=sqrt(n);
ll i;
for(i=1;i<=c;i++){
ans+=n/i;
if((n/i)>(n/(i+(ll)1))) {
ans+=((n/i-n/(i+(ll)1))*i);
}
}
i--;
if(n/i==i) ans-=i;
printf("Case %d: %lld
",time,ans);
}
int main(){
ll t;
cin>>t;
for(ll i=1;i<=t;i++) solve(i);
return 0;
}