for(i64 l = 1,r;l <= n; l = r + 1){ i64 k = n / i; r = n / k; // code for solution}// 对于向上取整for(i64 l = 1,r;l <= n;l = r + 1){ i64 k = (n + l - 1) / l; if(l == 1){ r = 1; } else{ r = max(n,(n - 1)/(k - 1)); } // code here}
Tip
注意整除分块中每一个循环都是一段区间的内容,所以不要忘记处理完成后将结果乘上区间长度r - l + 1
一个例子,可以看下面计算约数计数和
Solution1
void solve(){ i64 n; cin >> n; i64 ans = 0; // 注意for中 l 应该是 跳入到下一个块中 for (i64 l = 1, r; l <= n; l = r + 1) { // 当前一个区间的整除数 i64 k = n / l; // 计算块右边界 r = n / k; // 计算结果(不要忘记块长) ans += k * (r - l + 1); } cout << ans << endl;}