-
-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy path2709-greatest-common-divisor-traversal.py
45 lines (37 loc) · 1.42 KB
/
2709-greatest-common-divisor-traversal.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# time complexity: O(n*m^1/2)
# space complexity: O(n+m)
from collections import defaultdict
from typing import List
class Solution:
def dfs(self, index, visitedIndex, visitedPrime):
if visitedIndex[index]:
return
visitedIndex[index] = True
for prime in self.index2prime[index]:
if visitedPrime.get(prime, False):
continue
visitedPrime[prime] = True
for index1 in self.prime2index[prime]:
if visitedIndex[index1]:
continue
self.dfs(index1, visitedIndex, visitedPrime)
def canTraverseAllPairs(self, nums: List[int]) -> bool:
self.prime2index = defaultdict(list)
self.index2prime = defaultdict(list)
for i, num in enumerate(nums):
temp = num
for j in range(2, int(num ** 0.5) + 1):
if temp % j == 0:
self.prime2index[j].append(i)
self.index2prime[i].append(j)
while temp % j == 0:
temp //= j
if temp > 1:
self.prime2index.setdefault(temp, []).append(i)
self.index2prime.setdefault(i, []).append(temp)
visitedIndex = [False] * len(nums)
visitedPrime = {}
self.dfs(0, visitedIndex, visitedPrime)
return all(visitedIndex)
nums = [2, 3, 6]
print(Solution().canTraverseAllPairs(nums))