题面:给定n,计算 n/i之和,其中1<=i<=n。
范围:1 <= n <= 1E12
分析:分块,假设区间[l,r]的结果都相同,即n/l=n/r,根据l可以推算出r,那么这个区间对结果的贡献就是区间长度乘以结果,时间复杂度为O(sqrtn)。
#include <bits/stdc++.h>
using i64 = long long;
int n, ans;
void solve() {
std::cin >> n;
for (int l = 1, r; l <= n; l = r + 1) {
r = n / (n / l);
ans += (r - l + 1) * (n / l);
}
std::cout << ans << "\n";
}
int main() {
std::cin.tie(0)->sync_with_stdio(0);
int t = 1;
while (t--) solve();
return 0;
}
标签:数论