[ABC342D]Square Pair

题目大意

给定一个序列A,他有N个元素,找出满足条件的\((i,j)\),使得\(a[i]*a[j]\)是完全平方数?
\(1 \leq N \leq 200000,1 \leq a_{i} \leq 200000\)

题解

这个题,枚举肯定会超时,然后我们来看数据范围,他能接受什么样的时间复杂度?
\(log\)的话,一般情况下要排序,这个排序也没啥用
还可以介绍根号算法,刚开始没什么思路
从结果上来看,想要变成完全平方数,那么质因子的指数肯定都是偶数

错误思路

刚开始想到,先把所有的质数都处理出来,如果两个数相乘,想要变成完全平方数,那么他们要含有相同的质因子,比如说质数2,找到所有包含2的\(a[i]\),枚举,看一下他们两个是否能成为完全平方数,这样我们必须先枚举质因子,然后\(n^{2}\)枚举,这样做是超时的,更重要的是,这样是错误,比如25和16他两可以相乘成为完全平方数,但是他们不具有相同的质因子

正确思路

延续刚才的思路,重新思考完全平方数具备什么样的特质?质因子的个数肯定是偶数,突然想到,我们可以从偶数这个地方做文章,比如\(a^{3}*a^{5}\),其实,想要知道他相乘后是否是完全平方数,3没用,我们可以把3减去偶数,降低到1,把5减去4,降低到1,判断本质是一样的,这样就都剩下3了,我们可以把\(a[i]\)进行这样的处理,这样\(a[i]\)里面只剩下质因子相乘的情况,想要和他构成完全平方数,只能和他相同,这样我们就可以用桶解决了
不得不感叹,这个题真的是太好了

posted @ 2024-07-11 16:55  xinyimama  阅读(17)  评论(0)    收藏  举报