func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 200005, mod = 1e9 + 7;   int n, head[N], nxt[N << 1], to[N << 1], num = 0, dfn[N], DFN = 0, a[N], dep[N];   inline void link(int x, int y) {     nxt[++num] = head[x];     to[num] = y;     head[x] = num;   }   namespace tr {   int fa[N], top[N], sz[N], son[N];   inline void dfs1(int x) {     sz[x] = 1;     dfn[x] = ++DFN;     for (int i = head[x]; i; i = nxt[i]) {       int u = to[i];       if (sz[u]) continue;       fa[u] = x;       dep[u] = dep[x] + 1;       dfs1(u);       sz[x] += sz[u];       if (sz[u] > sz[son[x]]) son[x] = u;     }   }   inline void dfs2(int x, int tp) {     top[x] = tp;     if (son[x]) dfs2(son[x], tp);     for (int i = head[x]; i; i = nxt[i])       if (to[i] != fa[x] && to[i] != son[x]) dfs2(to[i], to[i]);   }   inline int lca(int x, int y) {     while (top[x] != top[y]) {       if (dep[top[x]] < dep[top[y]]) swap(x, y);       x = fa[top[x]];     }     return dep[x] < dep[y] ? x : y;   }   void main() {     dep[1] = 1;     dfs1(1);     dfs2(1, 1);   }   }  // namespace tr   int prime[N], sp = 0, mu[N], phi[N], b[N], m = 0, id[N], g[N];   bool vis[N];   void priwork() {     phi[1] = 1;     mu[1] = 1;     for (int to, i = 2; i <= n; i++) {       if (!vis[i]) prime[++sp] = i, mu[i] = -1, phi[i] = i - 1;       for (int j = 1; j <= sp && i * prime[j] <= n; j++) {         vis[to = i * prime[j]] = 1;         if (i % prime[j])           mu[to] = -mu[i], phi[to] = phi[i] * (prime[j] - 1);         else {           phi[to] = phi[i] * prime[j];           break;         }       }     }     tr::main();   }   inline bool comp(int i, int j) { return dfn[i] < dfn[j]; }   int st[N], top, w[N], f[N], inv[N], ST[N], cnt = 0;   inline int solve() {     int sum = 0, x, lca, ret = 0, y = 0;     top = 0;     for (int i = 1; i <= m; i++)       sum = (sum + phi[a[b[i]]]) % mod, w[b[i]] = phi[a[b[i]]];     sort(b + 1, b + m + 1, comp);     st[++top] = b[1];     w[b[1]] = phi[a[b[1]]];     ST[++cnt] = b[1];     for (int i = 2; i <= m; i++) {       x = b[i];       y = 0;       lca = tr::lca(x, st[top]);       while (dep[lca] < dep[st[top]]) {         if (y)           ret = (ret + 1ll * (dep[y] - dep[st[top]]) * w[y] % mod *                            (sum - w[y] + mod) % mod) %                 mod;         if (y) w[st[top]] = (w[st[top]] + w[y]) % mod;         y = st[top--];       }       if (st[top] != lca) st[++top] = lca, ST[++cnt] = lca;       if (y)         ret = (ret + 1ll * (dep[y] - dep[st[top]]) * w[y] % mod *                          (sum - w[y] + mod) % mod) %               mod;       if (y) w[st[top]] = (w[st[top]] + w[y]) % mod;       if (st[top] != x) st[++top] = x, ST[++cnt] = x;     }     while (top > 1) {       ret = (ret + 1ll * (dep[st[top]] - dep[st[top - 1]]) * w[st[top]] % mod *                        (sum - w[st[top]] + mod) % mod) %             mod;       w[st[top - 1]] = (w[st[top]] + w[st[top - 1]]) % mod;       top--;     }     while (cnt) w[ST[cnt]] = 0, cnt--;     return (ret << 1) % mod;   }   long long qm(long long x, long long k) {     long long sum = 1;     while (k) {       if (k & 1) sum = sum * x % mod;       x = x * x % mod;       k >>= 1;     }     return sum;   }   void work() {     int x, y;     scanf( %d , &n);     for (int i = 1; i <= n; i++) scanf( %d , &a[i]), id[a[i]] = i;     for (int i = 1; i < n; i++) {       scanf( %d%d , &x, &y);       link(x, y);       link(y, x);     }     priwork();     for (int i = 1; i <= n; i++) {       m = 0;       for (int j = i; j <= n; j += i) b[++m] = id[j];       g[i] = solve();     }     for (int i = 1; i <= n; i++)       for (int j = i; j <= n; j += i) f[i] = (f[i] + mu[j / i] * g[j]) % mod;     int ans = 0;     for (int i = 1; i <= n; i++) inv[i] = qm(i, mod - 2);     for (int i = 1; i <= n; i++)       ans = (ans + 1ll * i * inv[phi[i]] % mod * f[i] % mod) % mod;     cout << ans * qm(1ll * n * (n - 1) % mod, mod - 2) % mod << endl;   }   int main() {     work();     return 0;   }   