第一种情况:求
如果暴力算法是O(n)的复杂度,而整除分块则将复杂度减低到O()
对于这种情况有两条重要的性质:
1.分块的块数最多为:
2.第i个数所在块的右端点为:
只需要进行分类前缀和即可
int ans = 0;
for (int l = 1, r; l <= n; l = r + 1) {
r = n / (n / l);
ans += n / l * (r - l + 1);
}
第二种情况:求?
这时需要预处理出f(x)的前缀和数组,再进行分块求和
for (int l = 1, r; l <= n; l = r + 1) {
r = n / (n / l);
ans += (sum[r] - sum[l - 1]) * (n / l);
}