给你一个由 n n n 个正整数组成的数组 a a a 。你可以对它进行以下操作:
- 选择一对元素 a i a_i ai 和 a j a_j aj ( 1 ≤ i , j ≤ n 1 \le i, j \le n 1≤i,j≤n 和 i ≠ j i \neq j i=j );
- 选择整数 a i ai ai 的除数之一,即整数 x x x 中的 a i m o d x = 0 a_i \bmod x = 0 aimodx=0 ;
- 将 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 = [ 100 , 2 , 50 , 10 , 1 100, 2, 50, 10, 1 100,2,50,10,1 /]包含 5 5 5 个元素。对它进行两次操作:
- 选择 a 3 = 50 a_3 = 50 a3=50 和 a 2 = 2 a_2 = 2 a2=2 , x = 5 x = 5 x=5 .将 a 3 a_3 a3 替换为 a 3 x = 50 5 = 10 \frac{a_3}{x} = \frac{50}{5} = 10 xa3=550=10 ,将 a 2 a_2 a2 替换为 a 2 ⋅ x = 2 ⋅ 5 = 10 a_2 \cdot x = 2 \cdot 5 = 10 a2⋅x=2⋅5=10 。得到的数组是 a a a = [ 100 , 10 , 10 , 10 , 1 100, 10, 10, 10, 1 100,10,10,10,1 ];
- 选择 a 1 = 100 a_1 = 100 a1=100 和 a 5 = 1 a_5 = 1 a5=1 , x = 10 x = 10 x=10 .将 a 1 a_1 a1 替换为 a 1 x = 100 10 = 10 \frac{a_1}{x} = \frac{100}{10} = 10 xa1=10100=10 ,将 a 5 a_5 a5 替换为 a 5 ⋅ x = 1 ⋅ 10 = 10 a_5 \cdot x = 1 \cdot 10 = 10 a5⋅x=1⋅10=10 。得到的数组是 a a a = [ 10 , 10 , 10 , 10 , 10 10, 10, 10, 10, 10 10,10,10,10,10 ]。
执行这些运算后,数组 a a a 中的所有元素都等于 10 10 10 。
输入
输入的第一行包含一个整数 t t t ( 1 ≤ t ≤ 2000 1 \le t \le 2000 1≤t≤2000 ) - 测试用例的数量。
然后是每个测试用例的描述。
每个测试用例的第一行包含一个整数 n n n ( 1 ≤ n ≤ 1 0 4 1 \le n \le 10^4 1≤n≤104 ) - 数组 a a a 中的元素个数。
每个测试用例的第二行正好包含 n n n 个整数 a i a_i ai ( 1 ≤ a i ≤ 1 0 6 1 \le a_i \le 10^6 1≤ai≤106 )。( 1 ≤ a i ≤ 1 0 6 1 \le a_i \le 10^6 1≤ai≤106 ) - 数组 a a a 中的元素。
保证所有测试用例中 n n n 的总和不超过 1 0 4 10^4 104 。
输出
为每个测试用例输出一行:
- 如果通过执行一定次数(可能为零)的操作可以使数组中的所有元素相等,则输出 “YES”;
- 否则输出 “否”。
您可以输出任何情况下的答案(例如,字符串 “yEs”、“yes”、"Yes "和 "YES "都将被识别为肯定答案)。
仔细分析两个操作可能带来的后果,如果一个数除以x之后另一个数又乘了x,那么就会导致整个数组的乘积永远不会改变。
即在这种情况下,其实是某个数的因数转移给了另一个数。
在这种条件下最终数组可以达成每个元素都相等,也就是每个元素的质因数都相同,想要实现所有数的质因数都相同,就必须进行质因数的转移,如果到最后能够转移出来,就必须满足组成数组元素的所有质因数是 n 的倍数,只有都是n的倍数才能够转移之后平均下来。
Code:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
void solve()
{
int n;
cin >> n;
vector<int> a(n);
unordered_map<int, int> primes;
for (int i = 0; i < n; i++)
{
cin >> a[i];
for (int j = 2; j <= a[i] / j; j++)
{
while (a[i] % j == 0)
{
a[i] /= j;
primes[j]++;
}
}
if (a[i] > 1)
primes[a[i]]++;
}
for (auto prime : primes)
{
if (prime.second % n != 0)
{
cout << "NO\n";
return;
}
}
cout << "YES\n";
return;
}
int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
return 0;
}