博客
关于我
牛客练习赛25 因数个数和
阅读量:525 次
发布时间:2019-03-08

本文共 603 字,大约阅读时间需要 2 分钟。

针对每一次数询问询问中的数值x(1e9),我们需要计算1到x范围内所有整数的因数个数之和。这涉及到对因数分解及其计数的重复运算,直接利用traditional方式就是计算每数的除数个数累加,这种方法的复杂度是n²,完全不适合处理x达到1e9的情况。

为了优化,我们可以利用数论中的数学性质。任何一个数x的因数对(i, j)满足i*j = x。因此,1到x的所有因数总数等价于统计每个i从1到sqrt(x)的贡献。当我们将x拆分为i与x/i的乘积时,每个i <= sqrt(x)对应到一个唯一的因数对。因此,我们只需统计i的数量即可覆盖所有因数对。这种方法的复杂度至多为sqrt(x),极大提升计算效率。

例如,对于x=10,sqrt(10)=3.162,向上取整为4。在这个循环中,i取1, 2, 3:

i=1: 10/1=10,计数+10个因数;i=2: 10/2=5,计数+5个因数;i=3: 10/3=3.333,只计数整数部分3,计数+3个因数;i=4: 10/4=2.5,计数+2个因数;这会导致因数总和为10+5+3+2=20个因数,实际因数数目为18(因为每个因数对被计算两次)。因此,最终因数总数应为20 - (3+2)=18。

这种方法展示了如何将指数级复杂度的计算优化为根数级复杂度,大大提升效率。代码实现简洁明了,适合实际操作。通过上述优化,我们可以方便、快速地处理非常大的数值范围。

转载地址:http://jckiz.baihongyu.com/

你可能感兴趣的文章
Objective-C实现all combinations所有组合算法(附完整源码)
查看>>
Objective-C实现all permutations所有排列算法(附完整源码)
查看>>
Objective-C实现all subsequences所有子序列算法(附完整源码)
查看>>
Objective-C实现AlphaNumericalSort字母数字排序算法(附完整源码)
查看>>
Objective-C实现alternate disjoint set不相交集算法(附完整源码)
查看>>
Objective-C实现alternative list arrange备选列表排列算法(附完整源码)
查看>>
Objective-C实现An Armstrong number阿姆斯特朗数算法(附完整源码)
查看>>
Objective-C实现anagrams字谜算法(附完整源码)
查看>>
Objective-C实现ApproximationMonteCarlo蒙特卡洛方法计算pi值算法 (附完整源码)
查看>>
Objective-C实现area under curve曲线下面积算法(附完整源码)
查看>>
Objective-C实现arithmetic算术算法(附完整源码)
查看>>
Objective-C实现armstrong numbers阿姆斯壮数算法(附完整源码)
查看>>
Objective-C实现articulation-points(关键点)(割点)算法(附完整源码)
查看>>
Objective-C实现atoi函数功能(附完整源码)
查看>>
Objective-C实现average absolute deviation平均绝对偏差算法(附完整源码)
查看>>
Objective-C实现average mean平均数算法(附完整源码)
查看>>
Objective-C实现average median平均中位数算法(附完整源码)
查看>>
Objective-C实现average mode平均模式算法(附完整源码)
查看>>
Objective-C实现avl 树算法(附完整源码)
查看>>
Objective-C实现AvlTree树算法(附完整源码)
查看>>