题目大意
给你一个包含 n n n 个正整数的数组 a a a,你可以进行以下操作:
- 选两个数 a i a_i ai和 a j a_j aj ( 1 < i , j ≤ n 1 < i, j \le n 1<i,j≤n且 i ≠ j i \ne j i=j)
- 选择 a i a_i ai的一个因数 x x x
- 将 a i a_i ai替换为 a i x \frac{a_i}{x} xai, a j a_j aj替换为 a j ⋅ x a_j \cdot x aj⋅x
请判断是否能通过有限次操作使 a a a 中所有元素相同(可以是 0 0 0次)。
解题思路
我们可以发现无论做多少次操作·
∏
i
=
1
n
a
i
\prod_{i=1}^n a_i
∏i=1nai 的值都是不变的。
所以我们可以得出如果可以通过操作,使
a
a
a 中所有数相等,那么
∏
i
=
1
n
a
i
n
\sqrt[n]{\prod_{i=1}^n a_i}
ni=1∏nai
必然属于
Z
\mathbb{Z}
Z (整数集),可是题目里
a
i
≤
1
0
6
a_i\le 10^6
ai≤106,
n
≤
1
0
4
n\le 10^4
n≤104,最终答案可能达到
a
i
60000
{a_i}^{60000}
ai60000,所以我们可以给每个数分解质因数,判断每个因子的个数是否能被
n
n
n 整除。
#include <bits/stdc++.h>
using namespace std;
int n, T, a[1000005];
map <int, int> mp;
void change(int x){
for(int i = 2; i * i <= x; i ++){
while(x % i == 0){
mp[i] ++;
x /= i;
}
}
if(x > 1){
mp[x] ++;
}
return ;
}
int main(){
cin >> T;
while(T --){
mp.clear();
cin >> n;
for(int i = 1; i <= n; i ++){
cin >> a[i];
change(a[i]);
}
int flag = true;
for(auto x : mp){
if(x.second % n > 0){
flag = false;
break;
}
}
if(flag == true){
cout << "YES\n";
}else{
cout << "NO\n";
}
}
}