题解链接:https://blog.csdn.net/qq_44607936/article/details/112300338
题意
给出x , y x, yx,y相邻的定义:如果l c m ( x , y ) g c d ( x , y ) \frac{lcm(x,y)}{gcd(x,y)}gcd(x,y)lcm(x,y) 是平方数,则称x , y x, yx,y两个数相邻。
给出一个长度为n nn的数列,每过一秒钟,数列中的每一个元素会被与它相邻的所有元素的乘积(包括它自身)所替换。
给出q qq个询问,问在第w i w_{i}wi秒时,当前数列中哪个元素有最多的相邻元素,不需要给出这个元素是谁,只要给出它的相邻元素个数。
题解
首先, l c m ( x , y ) = x ∗ y g c d ( x , y ) lcm(x, y) = \frac{x*y}{gcd(x,y)}lcm(x,y)=gcd(x,y)x∗y,得出l c m ( x , y ) g c d ( x , y ) = x ∗ y g c d ( x , y ) 2 \frac{lcm(x,y)}{gcd(x,y)} = \frac{x*y}{gcd(x,y)^2}gcd(x,y)lcm(x,y)=gcd(x,y)2x∗y.
如果x ∗ y g c d ( x , y ) 2 = z 2 \frac{x*y}{gcd(x,y)^2} = z^2gcd(x,y)2x∗y=z2 是平方数, 则x ∗ y = z 2 ∗ g c d ( x , y ) 2 x*y = z^2 * gcd(x,y)^2x∗y=z2∗gcd(x,y)2也是平方数。也可知如果x ∗ y x*yx∗y是平方数,x ∗ y g c d ( x , y ) 2 \frac{x*y}{gcd(x,y)^2}gcd(x,y)2x∗y也一定是平方数。
所以,l c m ( x , y ) g c d ( x , y ) \frac{lcm(x,y)}{gcd(x,y)}gcd(x,y)lcm(x,y) 是平方数当且仅当x ∗ y x*yx∗y是平方数。
x ∗ y x*yx∗y是平方数,那么x ∗ y x*yx∗y分解质因数后,每个质因数的指数必定是偶数,那么x xx和y yy分别分解质因数后其质因数的指数奇偶性必定相同。
也就是说,质因数的指数是多少已经不重要,只关心它们的奇偶性,那么就将指数模2 22变成0 00或1 11。将质因数指数01 0101相同的数分成一组,它们之间质因数的指数奇偶性都相同,也就互相相邻。这样就能统计某一时刻最多的相邻元素个数了。
下面考虑每一个时刻的情况是怎么样的。
可以发现如果一个组内元素个数是偶数,那么经过一秒后,它们的质因数指数都将变成0 00(相乘时指数相加,偶数个1相加模2是0)。也就是说这样的组连同本来质因数指数就全是偶数的小组合成了一组。
如果组内元素个数是奇数,经过一秒后,它们的乘积的质因数指数将与它们完全一致(奇数个1 11相加依然是奇数)。就是说它们不会改变。
那么就能得出结论,1 11秒及之后的时间情况都是和1 11秒的时候相同的,答案只要考虑0 00秒和1 11秒之后两种情况。
具体统计某个01 0101情况,可以将指数是奇数的质因数记录下来,如果两个数这些指数为1 11的质因数相同,那么它们就是同一组的。
可以用将指数是奇数的质因数h a s h hashhash记录,用m a p mapmap维护每个h a s h hashhash值有多少元素。具体见代码。