数论
整数分块
整数分块用于快速处理,形如:
通过推理可以发现,假设它的起始下标是l,那么它的结束下标为r = n / (n / l)。
例如当n = 5时,sum = 5 + 2 + 1 + 1 + 1;
需要注意的是除以0的时候。
#include <cstdio>
typedef long long ll;
ll solve() {
ll n, ans = 0;
scanf("%lld", &n);
for (ll l = 1, r; l <= n; l = r + 1) {
r = n / (n / l); //关键操作
ans += n / l * (r - l + 1);
}
return ans;
}
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) printf("Case %d: %lld\n", i, solve());
}