题目大意就是将一个数组里面所有的数,两两组合求最大公约数,然后所有最大公约数构成一个新的数组,重复这个操作,直到数组里所有数都为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++