小M的数组变换|豆包MarsCode AI 刷题

103 阅读3分钟

问题描述

小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'

代码提示

image.png

image.png

### 题目分析

小M拿到一个数组,她可以进行多次操作,每次操作可以选择两个元素 ai​ 和 aj​,并选择 ai​ 的一个因子 x,然后将 ai​ 变为 ai​/x,并将 aj​ 变为 aj​×x。她的目标是通过有限次操作,使得数组中的每个元素最多只包含一种素因子。

目标

判断是否有可能通过有限次操作,使数组中的每个元素最多只包含一种素因子。如果可以,输出 "Yes",否则输出 "No"

关键点

  1. 素因子:每个数可以分解为若干个素数的乘积。
  2. 操作:每次操作可以选择两个元素 ai​ 和 aj​,并选择 ai​ 的一个因子 x,然后将 ai​ 变为 ai​/x,并将 aj​ 变为 aj​×x。
  3. 目标:通过有限次操作,使得数组中的每个元素最多只包含一种素因子。

解题思路

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;
}

总结

通过上述分析和代码框架,我们可以看到如何通过素因子分解、构建素因子图和检查图的连通性来解决这个问题。希望这些思路和代码框架能帮助你更好地理解和实现解决方案。