1 条题解
-
0
数学原理详解
本题要求计算和式 , 其中 表示正整数 的约数个数。直接对每个 计算约数个数再求和的方法时间复杂度为 ,当 较大时(如 )效率较低。因此,我们需要一种更高效的数学方法。
关键变换:交换求和顺序
考虑所有从 到 的整数,每个数 的约数个数 可以理解为所有能整除 的约数 的个数。
因此,原和式可以重写为:
=
就是k 整除 i
这里内层求和表示对每个 ,计算其约数的个数。现在,我们交换求和顺序:改为先固定约数 ,然后计算 作为约数出现在多少个 中(其中 )。由于 是 的约数当且仅当 是 的倍数,因此对于每个 ,满足 且 的 的个数就是 的倍数中不超过 的个数,即 。
换句话说:
- 正是 在范围 到 中作为约数出现的次数(即“有效的个数”)。例如,如果 和,那么 的倍数有,所以出现了 2 次,而。
因此,求和 实际上是在对所有可能的约数 计算其出现的频次,从而等价于原问题。这种变换是数论中常见的技巧,称为“除数求和”或“交换求和顺序”。
因此,原和式等价于:
=
这个变换将问题转化为计算所有 从 到 的 之和。
效率分析
直接计算新和式的时间复杂度为 ,对于 是可行的。但还可以进一步优化:由于 的值对于连续的 可能相同,我们可以找到使值相同的区间,批量计算。具体来说,对于每个 ,存在最大的 使得
=,则 。
这样,求和的时间复杂度可降为 。但对于本题范围,直接循环 从 到 也已足够。
样例验证
取输入样例 :
- 直接计算:
- ,,,
- 和为 。
- 用新方法:
- ,,,
- 和为 。结果一致。
- 1
信息
- ID
- 5610
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者