题目分析
我的做法就是枚举1到sqrt(n),然后会发现n/i只会出现一次,但是对应的i会出现(n/i-n/(i+1))次,可以想一下如果n为100,那么1出现(100/1-100/2)次,即100除以51,52,52……..100都为1。因此1直接计算即可。
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
int main(){
int T;
scanf("%d", &T);
for(int kase = 1; kase <= T; kase++){
LL n;
scanf("%lld", &n);
LL p, q, ans = 0;
for(LL i = 1; i <= sqrt(n+0.5); i++){
p = n/i;
q = i+1;
ans += p;
if(p < q) continue;
ans += i*(n/i - n/q);
}
printf("Case %d: %lld\n", kase, ans);
}
return 0;
}