CF1881D 质因数分解与重新分配

题目

You are given an array \(a\) consisting of \(n\) positive integers. You can perform the following operation on it:

  1. Choose a pair of elements \(a_i\) and \(a_j\) (\(1 \le i, j \le n\) and \(i \neq j\));
  2. Choose one of the divisors of the integer \(a_i\), i.e., an integer \(x\) such that \(a_i \bmod x = 0\);
  3. 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:

  1. 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\)];
  2. 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;
}

posted on 2024-06-05 00:36  TaopiTTT  阅读(3)  评论(0编辑  收藏  举报