题目大意
有 个元素,第 个元素的值是 。对于任意一对 ,你可以选择一个整数 ,将 乘上 ,将 除以 ,最后使得所有的元素都是一个值。问你可不可以完成这个操作。
思路
首先找规律,我们可以发现将 分解质因数后,若每一种质因子的数量都是 的倍数的话,那么就代表可以化为同一个元素。因为如果是 的倍数的话,那么这个质因子就可以互相传递,那么假设数量为 ,每一个元素就得到了 ,就可以达到判断是否能够达到同一个元素的效果。
现在我们就需要快速分解质因数。假设我们需要分解 ,可以考虑分两种情况:
- 本身就是质数:直接把 分离出来;
- 是合数:枚举 的质因子,并直接进行分解。
然后我们使用一个 map 存下每一个质因子的数量,最后对 map 里面的值进行判断。
代码
#include <iostream>
#include <map>
using namespace std;
const int kMaxN = 1e4 + 5;
int a[kMaxN], t, n;
map<int, int> f;
int main() {
for (cin >> t; t; t--) {
cin >> n, f.clear();
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= n; i++) {
for (int j = 2; j * j <= a[i]; j++) {
for (; a[i] % j == 0; a[i] /= j) {
f[j]++;
}
}
if (a[i] != 1) {
f[a[i]]++;
}
}
bool ans = 1;
for (auto i : f) {
ans &= i.second % n == 0;
}
cout << (ans ? "YES" : "NO") << '\n';
}
return 0;
}