Skip to content

Commit 2dd0f5b

Browse files
authored
Create 2709. Greatest Common Divisor Traversal (#417)
2 parents 8cd0d28 + 8bdaf58 commit 2dd0f5b

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
class Solution {
2+
public:
3+
int get(vector<int> &parent, int a) {
4+
return parent[a] = parent[a] == a ? a : get(parent, parent[a]);
5+
}
6+
void Union(vector<int> &parent, vector<int> &rank, int a, int b) {
7+
a = get(parent, a);
8+
b = get(parent, b);
9+
if(a == b) return;
10+
if(rank[a] < rank[b]) swap(a, b);
11+
parent[b] = a;
12+
rank[a] += rank[b];
13+
}
14+
vector<int> factorsCalculator(int n) {
15+
vector<int> dp(n + 2);
16+
iota(dp.begin(), dp.end(), 0);
17+
for(int i = 2; i <= n; ++i) {
18+
if(dp[i] == i) {
19+
for(int j = i * 2; j <= n; j += i) {
20+
if(dp[j] == j) dp[j] = i;
21+
}
22+
}
23+
}
24+
return dp;
25+
}
26+
bool canTraverseAllPairs(vector<int>& nums) {
27+
if(nums.size() == 1) return true;
28+
int n = nums.size();
29+
int maxElement = *max_element(nums.begin(), nums.end());
30+
if(*min_element(nums.begin(), nums.end()) == 1) return false;
31+
vector<int> factorArray = factorsCalculator(maxElement);
32+
33+
vector<int> parent(maxElement + 1);
34+
iota(parent.begin(), parent.end(), 0);
35+
;
36+
vector<int> rank(maxElement + 1, 1);
37+
for(int i = 0; i < n; ++i) {
38+
int x = nums[i];
39+
while(x > 1) {
40+
int p = factorArray[x];
41+
Union(parent, rank, p, nums[i]);
42+
while(x % p == 0) {
43+
x = x / p;
44+
}
45+
}
46+
}
47+
48+
int p = get(parent, nums[0]);
49+
for(int i = 1; i < n; ++i) {
50+
if(get(parent, nums[i]) != p) return false;
51+
}
52+
53+
return true;
54+
}
55+
};

0 commit comments

Comments
 (0)