[CP] 质因子分解的优化
以 D. Divide and Equalize 为例,对于给定数组
注意到这一操作并没有改变数组中所有元素的乘积(
于是我使用欧拉筛法,预先计算出数据范围(m
是 std::unordered_map<int, int>
):
std::cin >> t; idx = 0; while (t != 1) { while (t % primes[idx] != 0) ++idx; t /= primes[idx]; ++m[primes[idx]]; }
实际效果很不理想,虽然通过了题目,但几乎就要 TLE(1918ms,时限 2000ms),参考了 jiangly 31ms 的 submission,我发现他在筛法函数里面加了一个 minp
数组,并在后续的分解质因子过程中采用 minp[t]
直接得到了 t
的质因子!相比我的代码,这无疑能带来很大的性能提升,节省许多无意义的取余操作,而取余是非常耗时的事情。
于是我开始研究 minp
数组的作用,结合它的名称和代码,我发现它存储的是当前元素的最小质因子,对此只需要对筛法函数做很小的改动,因为欧拉筛法的性质天然地保证每个合数只被筛到一次,所以当我们确定某个合数不是素数(也就是将其筛去)时,就可以相应地在 minp
数组中记录,此时记录的质因子一定是最小的。
在添加了 minp
数组后,质因子分解部分也得以优化为:
while (t != 1) { ++m[minp[t]]; t /= minp[t]; }
这是优化前后的对比:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)