题意:给出一个数n,求n/1+n/2+n/3+...+n/n。
思路:都是正整数运算,但数据范围是从1到2^31,且一个点有1000个测试数据,暴力绝对t。我们发现,若是整数运算,则100/34=2,100/50=2,所以从34到50都是2,就可以进行分块处理。
#include <bits/stdc++.h>
#define lcm(a,b) ((a)*(b)/(__gcd((a),(b))))
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
ll t, n, j, v = 1;
int main() {
cin >> t;
while(t--) {
cin >> n;
ll ans = 0;
for(ll i = 1; i <= n; i += (j - i + 1)) {
int k = n / i;
j = n / k;
ans += k * (j - i + 1);
}
printf("Case %lld: %lld\n", v++, ans);
}
return 0;
}