CF1881D 质因数分解与重新分配
题目
You are given an array \(a\) consisting of \(n\) positive integers. You can perform the following operation on it:
- Choose a pair of elements \(a_i\) and \(a_j\) (\(1 \le i, j \le n\) and \(i \neq j\));
- Choose one of the divisors of the integer \(a_i\), i.e., an integer \(x\) such that \(a_i \bmod x = 0\);
- Replace \(a_i\) with \(\frac{a_i}{x}\) and \(a_j\) with \(a_j \cdot x\).
Determine whether it is possible to make all elements in the array the same by applying the operation a certain number of times (possibly zero).
For example, let's consider the array \(a\) = [\(100, 2, 50, 10, 1\)] with \(5\) elements. Perform two operations on it:
- Choose \(a_3 = 50\) and \(a_2 = 2\), \(x = 5\). Replace \(a_3\) with \(\frac{a_3}{x} = \frac{50}{5} = 10\), and \(a_2\) with \(a_2 \cdot x = 2 \cdot 5 = 10\). The resulting array is \(a\) = [\(100, 10, 10, 10, 1\)];
- Choose \(a_1 = 100\) and \(a_5 = 1\), \(x = 10\). Replace \(a_1\) with \(\frac{a_1}{x} = \frac{100}{10} = 10\), and \(a_5\) with \(a_5 \cdot x = 1 \cdot 10 = 10\). The resulting array is \(a\) = [\(10, 10, 10, 10, 10\)].
After performing these operations, all elements in the array \(a\) become equal to \(10\).
https://codeforces.com/contest/1881/problem/D
Input
The first line of the input contains a single integer \(t\) (\(1 \le t \le 2000\)) — the number of test cases.
Then follows the description of each test case.
The first line of each test case contains a single integer \(n\) (\(1 \le n \le 10^4\)) — the number of elements in the array \(a\).
The second line of each test case contains exactly \(n\) integers \(a_i\) (\(1 \le a_i \le 10^6\)) — the elements of the array \(a\).
It is guaranteed that the sum of \(n\) over all test cases does not exceed \(10^4\).
7
5
100 2 50 10 1
3
1 1 1
4
8 2 4 2
4
30 50 27 20
2
75 40
2
4 4
3
2 3 1
Output
For each test case, output a single line:
- "YES" if it is possible to make all elements in the array equal by applying the operation a certain (possibly zero) number of times;
- "NO" otherwise.
You can output the answer in any case (for example, the strings "yEs", "yes", "Yes", and "YES" will all be recognized as a positive answer).
YES
YES
NO
YES
NO
YES
NO
题解
解题思路
显然这是一道数论题,我们观察到,无论怎么进行操作,总数的积不变;
那么操作的本质就是质因数的分解和重新分配,只需让相同质因数的个数是\(n\)的倍数,就可以平均分配。
Code
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false); cin.tie(nullptr);
using namespace std;
typedef long long LL;
signed main(){
IOS;
int _;cin>>_;
while(_--){
int n;cin>>n;
map<int,int> mp;
//质因数分解
auto f=[&](int x){
for(int i=2;i<=sqrt(x);i++){
while(x%i==0){
mp[i]++;
x/=i;
}
}
if(x>1) mp[x]++;
};
for(int i=1;i<=n;i++){
int t;cin>>t;
f(t);
}
bool fl=0;
for(auto i:mp){
auto t=i.second;
if(t%n!=0){
cout<<"NO"<<endl;
fl=1;break;
}
}
if(!fl) cout<<"YES"<<endl;
}
return 0;
}