约数个数和定理
我们记 为 数 的约数个数,存在等式
这个等式的证明如下
记二重计数集合
含义为两个大于1的正整数其乘积小于等于我们需要得知的即为
按积分组角度
对于每一个,将所有满足 的有序对计入,这个有序对个数正好就是,将到累加有:
按固定的 角度
固定,则满足条件的的个数是满足 的个数,即:
累加有:
而这两个计数的是同一个集合,结合可证
Tip
在具体计算的时候有时由于 过大,我们还需要将算法复杂度从 降低到 ,具体操作可以使用 整除分块
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;
}