1 条题解

  • 0
    @ 2025-10-26 4:39:52

    数学原理详解

    本题要求计算和式 i=1nf(i)\sum_{i=1}^n f(i), 其中 f(i)f(i) 表示正整数 ii 的约数个数。直接对每个 ii 计算约数个数再求和的方法时间复杂度为 O(nn)O(n \sqrt{n}),当 nn 较大时(如 n106n \leq 10^6)效率较低。因此,我们需要一种更高效的数学方法。

    关键变换:交换求和顺序

    考虑所有从 11nn 的整数,每个数 ii 的约数个数 f(i)f(i) 可以理解为所有能整除 ii 的约数 kk 的个数。

    因此,原和式可以重写为:

    i=1nf(i)\sum_{i=1}^n f(i) = i=1nki1\sum_{i=1}^n \sum_{k \mid i} 1

    kik \mid i 就是k ​​整除​​ i

    这里内层求和表示对每个 ii,计算其约数的个数。现在,我们交换求和顺序:改为先固定约数 kk,然后计算 kk 作为约数出现在多少个 ii 中(其中 ini \leq n)。由于 kkii 的约数当且仅当 iikk 的倍数,因此对于每个 kk,满足 kik \mid iini \leq nii 的个数就是 kk 的倍数中不超过 nn 的个数,即 nk\left\lfloor \frac{n}{k} \right\rfloor

    换句话说:

    -nk\left\lfloor \frac{n}{k} \right\rfloor 正是kk 在范围11nn 中作为约数出现的次数(即“有效的个数”)。例如,如果k=2k=2n=5n=5,那么22 的倍数有2,42, 4,所以出现了 2 次,而52=2\left\lfloor \frac{5}{2} \right\rfloor = 2

    因此,求和k=1n\sum_{k=1}^nnk \left\lfloor \frac{n}{k} \right\rfloor 实际上是在对所有可能的约数kk 计算其出现的频次,从而等价于原问题。这种变换是数论中常见的技巧,称为“除数求和”或“交换求和顺序”。

    因此,原和式等价于:

    i=1nf(i) \sum_{i=1}^n f(i) = k=1n\sum_{k=1}^n nk\left\lfloor \frac{n}{k} \right\rfloor

    这个变换将问题转化为计算所有 kk11nnnk\left\lfloor \frac{n}{k} \right\rfloor 之和。

    效率分析

    直接计算新和式的时间复杂度为 O(n)O(n),对于 n106n \leq 10^6 是可行的。但还可以进一步优化:由于 nk\left\lfloor \frac{n}{k} \right\rfloor 的值对于连续的 kk 可能相同,我们可以找到使值相同的区间,批量计算。具体来说,对于每个 kk,存在最大的 mm 使得

    nk\left\lfloor \frac{n}{k} \right\rfloor =nm \left\lfloor \frac{n}{m} \right\rfloor,则 m=nn/km=⌊\frac{n}{⌊n /k⌋}⌋

    这样,求和的时间复杂度可降为 O(n)O(\sqrt{n})。但对于本题范围,直接循环 kk11nn 也已足够。

    样例验证

    取输入样例 n=3n = 3

    • 直接计算:
    • f(1)=1f(1) = 1f(2)=2f(2) = 2f(3)=2f(3) = 2
    • 和为 1+2+2=51 + 2 + 2 = 5
    • 用新方法:
    • 31=3\left\lfloor \frac{3}{1} \right\rfloor = 332=1\left\lfloor \frac{3}{2} \right\rfloor = 133=1\left\lfloor \frac{3}{3} \right\rfloor = 1
    • 和为 3+1+1=53 + 1 + 1 = 5。结果一致。
    • 1

    信息

    ID
    5610
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    1
    已通过
    1
    上传者