约数个数和定理

我们记 为 数 的约数个数,存在等式

这个等式的证明如下

记二重计数集合
含义为两个大于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;
}