#include #include #include #include #include using namespace std; template class y_combinator_result { Fun fun_; public: template explicit y_combinator_result(T &&fun): fun_(std::forward(fun)) {} template decltype(auto) operator()(Args &&...args) { return fun_(std::ref(*this), std::forward(args)...); } }; template decltype(auto) y_combinator(Fun &&fun) { return y_combinator_result>(std::forward(fun)); } const int MAXV = 6400; int main() { vector ord(MAXV+1, -1); vector good; vector> goodps; vector> factors(MAXV+1); { vector valid(MAXV+1); for(int i = 2; i <= MAXV; i++) { int j = i; bool can = true; vector divs; for(int x = 2; x <= 100; x++) { if(j%x==0) { j /= x; divs.push_back(x); } if(j%x==0) { can = false; break; } } if(valid[i] = (can && j == 1)) { ord[i] = (int)good.size(); good.push_back(i); goodps.push_back(divs); } } } for(int a: good) for(int b: good) { if(gcd(a, b) > 1) factors[a].push_back(b); } ios_base::sync_with_stdio(false); cin.tie(NULL); int n; cin >> n; vector vals(n); for(auto& x: vals) cin >> x; vector> edges(n); vector> dp(n); auto dfs = y_combinator([&](auto self, int curr, int par) -> void { for(int out: edges[curr]) { if(out == par) continue; self(out, curr); for(int i = 0; i < (int)good.size(); i++) { int cand = 1e9; for(int j: factors[good[i]]) cand = min(cand, dp[out][ord[j]]); dp[curr][i] += cand; } } }); for(int i = 0; i < n; i++) { dp[i].resize(good.size()); for(int j = 0; j < (int)good.size(); j++) { bool alldiv = true; int cand = vals[i]; for(int out: goodps[j]) { if(cand%out) { alldiv = false; break; } while(cand%out==0) cand /= out; } if(alldiv && cand == 1) continue; dp[i][j] = good[j]; } } for(auto& x: dp) x.resize(good.size()); for(int i = 1; i < n; i++) { int a, b; cin >> a >> b; a--; b--; edges[a].push_back(b); edges[b].push_back(a); } dfs(0, -1); cout << *min_element(dp[0].begin(), dp[0].end()) << "\n"; }