ural 2003 - simple magic 解题思路

题目大意就是将一个数组里面所有的数,两两组合求最大公约数,然后所有最大公约数构成一个新的数组,重复这个操作,直到数组里所有数都为1。

问给你任意一个数组,要多少次操作才能完成

 

稍微分析一下,会发现答案只有4种,即0,1, 2, inf

0很好理解,就是给定的那个数组本身就全为1

1说明只经过一次操作,由于是求最大公约数,所以可知数组里面所有数是两两互质的

2说明,经过第一次操作后,数组里的所有数是两两互质的。也就意味着原始数组里,至多存在任意两个数,相互是不互质的

出现inf的情况,就是原始数组中,可以找到3个及以上的数,两两相互不互质

 

那么已经知道了所有的情况,就可以设计算法来实现。

注意N的范围是[3,10000],所以N^2的算法会TLE,辗转相除法就不用考虑了。

从另外一个角度考虑,求互质其实就是求是否有非1的公约数,那么可以对所有数进行质因数分解的操作,最后仅需验证是否有某个质因数出现次数超过3即可。

其中有个注意点是,对于数组中的一个数的相同质因数,仅计算一次,如8 = 2 * 2 * 2,在计算质因数2出现次数时,只算作一次

这个算法的复杂度是N*sqrt(M),题目中M小于10^7

 

另外,py3.6往后稍稍吧,会TLE过不了的。只好老老实实写个C++

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值