最大公约数的遍历插图

#define _CRT_SECURE_NO_WARNINGS
#include
#include
using namespace std;
#define maa ((int)1e5)
vector<int> fac[maa + 5];
void ini() {
for (int i = 2; i <= maa; i++) {
if (fac[i].empty()) {
for (int j = i; j <= maa; j += i) {
fac[j].push_back(i);
}
}
}
}
int root[maa*10];
int find(int x) {
if (root[x] == x) return x;
return root[x] = find(root[x]);
}
bool fun(vector<int> nums) {
ini();
int n = nums.size();
int mx = 0;  // 记录最大值
for (int x : nums) {
mx = max(mx, x);
}
for (int i = 0; i <= n + mx; i++) root[i] = i;
for (int i = 0; i < n; i++) {
for (int p : fac[nums[i]]) {
int x = find(i), y = find(p + n);
if (x == y) continue;
root[x] = y;
}
}
unordered_set<int> st;
for (int i = 0; i < n; i++) {
st.insert(find(i));  // 这个要注意,要再次调用find
}
return st.size() == 1;
}
int main() {
vector<int> a = { 4,3,12,8 };
cout << fun(a);
return 0;
}
本站无任何商业行为
个人在线分享 » 最大公约数的遍历
E-->