Skip to content

Commit dfbae86

Browse files
committed
getCoprimes
1 parent c9125c1 commit dfbae86

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

tree-of-coprimes/export.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,7 @@ package index
33
func GetCoprimes(nums []int, edges [][]int) []int {
44
return getCoprimes(nums, edges)
55
}
6+
func GreatestCommonDivisor(a int, b int) int {
7+
8+
return greatestCommonDivisor(a, b)
9+
}

tree-of-coprimes/index.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,74 @@
11
package index
22

3+
var prime = make([][]bool, 0)
4+
35
func getCoprimes(nums []int, edges [][]int) []int {
6+
var edge = make([][]int, len(nums))
7+
8+
for i := range edge {
9+
edge[i] = make([]int, 0)
10+
}
11+
for _, e := range edges {
12+
a, b := e[0], e[1]
13+
edge[a] = append(edge[a], b)
14+
edge[b] = append(edge[b], a)
15+
}
16+
if len(prime) == 0 {
17+
for i := 0; i < 51; i++ {
18+
prime = append(prime, make([]bool, 51))
19+
}
20+
for i := 0; i < 51; i++ {
21+
for j := i; j < 51; j++ {
22+
prime[j][i] = greatestCommonDivisor(i, j) == 1
23+
prime[i][j] = prime[j][i]
24+
}
25+
}
26+
}
27+
28+
var set = make(map[int]bool, 0)
29+
for _, n := range nums {
30+
set[n] = true
31+
}
32+
var visited = make(map[int]bool, 0)
33+
var currents = make([][][]int, 51)
34+
for i := 0; i < 51; i++ {
35+
currents[i] = make([][]int, 0)
36+
}
37+
38+
var results = make([]int, len(nums))
39+
var dfs func(node, depth int)
40+
dfs = func(node, depth int) {
41+
if visited[node] {
42+
return
43+
}
44+
visited[node] = true
45+
var value = nums[node]
46+
var ans = []int{-1, -1}
47+
for i := range set {
48+
if len(currents[i]) > 0 && prime[value][i] {
49+
var get = currents[i][len(currents[i])-1]
50+
if get[1] > ans[1] {
51+
ans = get
52+
}
53+
}
54+
}
55+
results[node] = ans[0]
56+
57+
for _, child := range edge[node] {
58+
currents[value] = append(currents[value], []int{node, depth})
59+
60+
dfs(child, depth+1)
61+
currents[value] = currents[value][0 : len(currents[value])-1]
62+
}
63+
}
64+
dfs(0, 0)
65+
66+
return results
67+
}
468

69+
func greatestCommonDivisor(a int, b int) int {
70+
for b != 0 {
71+
return greatestCommonDivisor(b, a%b)
72+
}
73+
return a
574
}

0 commit comments

Comments
 (0)