← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	in := bufio.NewReader(os.Stdin)
	var n int
	fmt.Fscan(in, &n)
	a := make([]int, n+1)
	for i := 1; i <= n; i++ {
		fmt.Fscan(in, &a[i])
	}
	adj := make([][]int, n+1)
	for i := 0; i < n-1; i++ {
		var x, y int
		fmt.Fscan(in, &x, &y)
		adj[x] = append(adj[x], y)
		adj[y] = append(adj[y], x)
	}
	const MAX = 200010
	spf := make([]int, MAX)
	for i := 0; i < MAX; i++ {
		spf[i] = i
	}
	for i := 2; i*i < MAX; i++ {
		if spf[i] == i {
			for j := i*i; j < MAX; j += i {
				if spf[j] == j {
					spf[j] = i
				}
			}
		}
	}
	nodesPerP := make(map[int][]int)
	for i := 1; i <= n; i++ {
		if a[i] > 1 {
			primes := getPrimes(a[i], spf)
			for _, p := range primes {
				nodesPerP[p] = append(nodesPerP[p], i)
			}
		}
	}
	ans := 0
	for _, nodes := range nodesPerP {
		inSp := make([]bool, n+1)
		for _, i := range nodes {
			inSp[i] = true
		}
		visited := make([]bool, n+1)
		maxForP := 0
		for _, start := range nodes {
			if visited[start] {
				continue
			}
			u, _ := bfsFarthest(start, adj, inSp, visited, true)
			_, dEdges := bfsFarthest(u, adj, inSp, visited, false)
			compMax := dEdges + 1
			if compMax > maxForP {
				maxForP = compMax
			}
		}
		if maxForP > ans {
			ans = maxForP
		}
	}
	fmt.Println(ans)
}

func getPrimes(x int, spf []int) []int {
	res := []int{}
	seen := make(map[int]bool)
	cur := x
	for cur > 1 {
		p := spf[cur]
		if !seen[p] {
			res = append(res, p)
			seen[p] = true
		}
		cur /= p
	}
	return res
}

func bfsFarthest(src int, adj [][]int, inSp []bool, vis []bool, markVis bool) (int, int) {
	n := len(adj) - 1
	dist := make([]int, n+1)
	for i := 0; i <= n; i++ {
		dist[i] = -1
	}
	dist[src] = 0
	q := make([]int, 0)
	q = append(q, src)
	front := 0
	farthest := src
	maxD := 0
	for front < len(q) {
		u := q[front]
		front++
		if markVis {
			vis[u] = true
		}
		if dist[u] > maxD {
			maxD = dist[u]
			farthest = u
		}
		for _, v := range adj[u] {
			if inSp[v] && dist[v] == -1 {
				dist[v] = dist[u] + 1
				q = append(q, v)
			}
		}
	}
	return farthest, maxD
}
```