2 条题解
-
6
本体观察数据范围显然不是暴力枚举每一个数字,求它有多少个因子的,如果是这么做的话,时间复杂度是的。
考虑对于中的每一个数字,因子是每一个数字都会有的,那么因子的个数就是
同理的个数
所以一个for循环求和即可。
for (int i = 1; i <= n; i++) { ans += n / i; }
这么做的时间复杂度是,已经可以通过本题,考虑进一步优化。
假如是,那么因子个数只有,也就是只有这两个有因子,同时我们发现都是因子个数的,后续的因子全都是,我们开始思考如何省去这部分重复计算,我们目前的研究的因子是,也就是找到和它的个数相等的边界,其实就是,例如,那我们下一个数字直接从去枚举,就解决了重复计算,对于重复的只需要统计重复了几次,显然是
for (int i = 1; i <= n; i = j + 1) { j = n / (n / i); ans += (j - i + 1) * (n / i); }
- 1
信息
- ID
- 1825
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 291
- 已通过
- 130
- 上传者