func_code_string: #include <bits/stdc++.h>   using namespace std;   inline int getint() {     static char c;     while ((c = getchar()) <  0  || c >  9 )       ;     int res = c -  0 ;     while ((c = getchar()) >=  0  && c <=  9 ) res = res * 10 + c -  0 ;     return res;   }   const int MaxN = 200005;   const int M = 1000000007;   inline int add(int a, const int &b) {     a += b;     return a >= M ? a - M : a;   }   inline int dec(int a, const int &b) {     a -= b;     return a < 0 ? a + M : a;   }   int n;   int key[MaxN];   vector<int> adj[MaxN];   int inv[MaxN];   int phi[MaxN];   vector<int> divs[MaxN];   vector<int> coe[MaxN];   int prod[MaxN];   inline void init_math() {     inv[1] = phi[1] = 1;     for (int i = 2; i <= n; ++i) {       phi[i] = i;       inv[i] = (long long)(M - M / i) * inv[M % i] % M;     }     for (int i = 1; i <= n; ++i) {       divs[i].push_back(i);       for (int j = i << 1; j <= n; j += i) {         divs[j].push_back(i);         phi[j] -= phi[i];       }     }     for (int i = 1; i <= n; ++i) coe[i].resize(divs[i].size());     coe[1][0] = 1;     for (int i = 2; i <= n; ++i) {       int p = divs[i][1];       if (p == i) {         coe[i][0] = 1;         coe[i][1] = inv[p - 1];         continue;       }       int q = i;       while (q % p == 0) q /= p;       for (int d : divs[i]) prod[d] = 0;       for (int i = 0; i < divs[p].size(); ++i)         for (int j = 0; j < divs[q].size(); ++j) {           int u = divs[p][i], a = coe[p][i];           int v = divs[q][j], b = coe[q][j];           int x = u * v, y = (long long)a * b % M;           prod[x] = add(prod[x], y);         }       for (int j = 0; j < divs[i].size(); ++j) coe[i][j] = prod[divs[i][j]];     }   }   bool book[MaxN];   int q_n, q[MaxN];   int fa[MaxN];   int dep[MaxN];   int size[MaxN];   inline void bfs(const int &sv, const int &prev) {     q[q_n = 1] = sv;     fa[sv] = prev, dep[sv] = 1;     for (int i = 1; i <= q_n; ++i) {       int u = q[i];       for (int v : adj[u])         if (!book[v] && v != fa[u]) {           fa[v] = u;           dep[v] = dep[u] + 1;           q[++q_n] = v;         }     }   }   inline int centroid(int root) {     bfs(root, 0);     int vC = 0, wC = q_n;     for (int i = 1; i <= q_n; ++i) size[q[i]] = 1;     for (int i = q_n; i >= 1; --i) {       int u = q[i];       size[fa[u]] += size[u];       int vW = q_n - size[u];       for (int v : adj[u])         if (!book[v] && v != fa[u]) vW = max(vW, size[v]);       if (vW < wC) wC = vW, vC = u;     }     return vC;   }   int nVer = 0;   int ver[MaxN];   int sum = 0;   int sum_phi[MaxN];   inline int calc(int v) {     int sum = 0;     for (int i = 0; i < divs[v].size(); ++i) {       int d = divs[v][i];       sum = add(sum, (long long)coe[v][i] * sum_phi[d] % M);     }     return (long long)sum * phi[v] % M;   }   inline void work(int vC) {     nVer = q_n;     for (int i = 1; i <= q_n; ++i) ver[i] = q[i];     for (int i = 1; i <= nVer; ++i) {       int v = key[ver[i]];       for (int d : divs[v]) sum_phi[d] = add(sum_phi[d], phi[v]);     }     for (int u : adj[vC])       if (!book[u]) {         bfs(u, vC);         for (int i = 1; i <= q_n; ++i) {           int v = key[q[i]];           for (int d : divs[v]) sum_phi[d] = dec(sum_phi[d], phi[v]);         }         for (int i = 1; i <= q_n; ++i) {           int v = q[i];           int w = key[v];           sum = add(sum, (long long)dep[v] * calc(w) % M);         }         for (int i = 1; i <= q_n; ++i) {           int v = key[q[i]];           for (int d : divs[v]) sum_phi[d] = add(sum_phi[d], phi[v]);         }       }     for (int i = 1; i <= nVer; ++i) {       int v = key[ver[i]];       for (int d : divs[v]) sum_phi[d] = 0;     }   }   void solve(int root) {     int vC = centroid(root);     book[vC] = true;     work(vC);     for (int v : adj[vC])       if (!book[v]) solve(v);   }   int main() {     n = getint();     for (int u = 1; u <= n; ++u) key[u] = getint();     for (int i = 1; i < n; ++i) {       int u = getint(), v = getint();       adj[u].push_back(v);       adj[v].push_back(u);     }     init_math();     solve(1);     sum = (long long)sum * inv[n] % M;     sum = (long long)sum * inv[n - 1] % M;     sum = (long long)sum * 2 % M;     printf( %d n , sum);     return 0;   }   