码迷,mamicode.com
首页 > 其他好文 > 详细

CodeForces 1325E - Ehab's REAL Number Theory Problem【质因子+】

时间:2020-03-17 00:06:21      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:输出   pre   cpp   接下来   之间   ble   数字   长度   个数   

题意:

??给定一个数组 \(a\) ,数组中任意一个元素的因子数不超过 \(7\) ,找出一个最短的子序列,满足该子序列之积为完全平方数。输出其长度。
数据范围:\(1≤n≤10^5,1≤a_i≤10^6\)

分析:

??首先,对于数组中的每个元素,如果其因子中包含有一个完全平方数,那么可以把该完全平方数除去,不影响最后的结果。
??然后,可以发现,当一个数的因子个数 \(\leq 7\) 时,其包含的质因子个数 \(\leq 2\)。(如果有3个质因子,那么至少有 \(8\) 个因子)当我们把每个数因子中的完全平方数除去后,每个数回变成 \(1,p,pq\)\(p,q\) 均为质数)中的一种。接下来,建一个图,图中每个顶点为一个质数和 \(1\),边为数组中元素化简后得到的数字。那么图的意义是什么呢?假设我们从点 \(p\) 经过一条边走到点 \(q\),那么我们就可以得到 \(p*q\)。要想最后得到一个完全平方数,那么必然会有一个点走两次,即整条路径是一个环。要使路径最短,就是要求一个最小环的长度。
??我们可以直接对每个点用一遍 \(bfs\) 来找到最小环,复杂度为:\(O(N*M)\),显然不行。但其实可以发现,对于两个都大于 \(\sqrt{a_{max}}\)的点,它们之间是不可能连边的,各自只能和更小的数的点连边,所以对于这些点,不用以它们为源点进行 \(bfs\)

代码:

参考博客

CodeForces 1325E - Ehab's REAL Number Theory Problem【质因子+】

标签:输出   pre   cpp   接下来   之间   ble   数字   长度   个数   

原文地址:https://www.cnblogs.com/1024-xzx/p/12507534.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!