问题描述
小M拿到一个数组,她可以进行多次操作,每次操作可以选择两个元素 aiai 和 ajaj,并选择 aiai 的一个因子 xx,然后将 aiai 变为 ai/xai/x,并将 ajaj 变为 aj×xaj×x。她的目标是通过有限次操作,使得数组中的每个元素最多只包含一种素因子。
素因子的定义是:若 xx 能被素数 pp 整除,那么 pp 是 xx 的一个素因子。例如,1212 的素因子有 22 和 33。
你的任务是判断是否有可能通过有限次操作,使数组中的每个元素最多只包含一种素因子。如果可以,输出 "Yes",否则输出 "No"。
测试样例
样例1:
输入:
n = 4 ,a = [1, 2, 3, 4]
输出:'Yes'
样例2:
输入:
n = 2 ,a = [10, 12]
输出:'No'
样例3:
输入:
n = 3 ,a = [6, 9, 15]
输出:'Yes'
代码提示
### 题目分析
小M拿到一个数组,她可以进行多次操作,每次操作可以选择两个元素 ai 和 aj,并选择 ai 的一个因子 x,然后将 ai 变为 ai/x,并将 aj 变为 aj×x。她的目标是通过有限次操作,使得数组中的每个元素最多只包含一种素因子。
目标
判断是否有可能通过有限次操作,使数组中的每个元素最多只包含一种素因子。如果可以,输出 "Yes",否则输出 "No"。
关键点
- 素因子:每个数可以分解为若干个素数的乘积。
- 操作:每次操作可以选择两个元素 ai 和 aj,并选择 ai 的一个因子 x,然后将 ai 变为 ai/x,并将 aj 变为 aj×x。
- 目标:通过有限次操作,使得数组中的每个元素最多只包含一种素因子。
解题思路
1. 素因子分解
对于每个数,分解其素因子,并记录每个素因子的出现次数。
2. 构建素因子图
将每个数与其素因子关联起来,构建一个图,其中节点是素因子,边表示两个素因子出现在同一个数中。
3. 连通性检查
检查这个图是否是连通的。如果图是连通的,说明可以通过操作将所有素因子合并到一个集合中,使得每个数最多只包含一种素因子。
完整代码
#include <iostream>
#include <vector>
#include <set>
using namespace std;
string solution(int n, vector<int>& a) {
// write code here
set<int> se;
for (auto x : a) {
for (int i = 2; i <= x / i; i++) {
if (x % i == 0) {
while (x % i == 0) {
x /= i;
}
se.insert(i);
}
}
if (x != 1) se.insert(x);
}
if (se.size() <= n) return "Yes";
return "No";
}
int main() {
vector<int> a1 = {1, 2, 3, 4};
vector<int> a2 = {10, 12};
vector<int> a3 = {6, 9, 15};
cout << (solution(4, a1) == "Yes") << endl;
cout << (solution(2, a2) == "No") << endl;
cout << (solution(3, a3) == "Yes") << endl;
return 0;
}
总结
通过上述分析和代码框架,我们可以看到如何通过素因子分解、构建素因子图和检查图的连通性来解决这个问题。希望这些思路和代码框架能帮助你更好地理解和实现解决方案。