#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int LG = 17;
const long long MAX = (long long)1e12 + 1;
const int BASE = 1e9 + 7;
int n, timer;
int h[N], x[N], y[N], V[N], sz[N];
int p[N][LG + 2];
long long answer = 0;
long long a[N];
vector<int> adj[N];
struct Node {
  long long lcm, sum;
  Node() {}
  Node(long long lcm, long long sum) : lcm(lcm), sum(sum) {}
};
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long Add(long long a, long long b) { return (a + b) % BASE; }
long long Round(long long a, long long b) { return (a + b - 1) / b; }
long long getLCM(long long a, long long b) {
  if (a == MAX || b == MAX) return MAX;
  if (a == 0 || b == 0) return 0;
  long long d = gcd(a, b);
  a /= d;
  if (b >= Round(MAX, a)) return MAX;
  return a * b;
}
struct SegmentTree {
  Node st[4 * N];
  void Init(int k, int l, int r) {
    st[k] = Node(0, 0);
    if (l == r) return;
    Init(k << 1, l, ((l + r) >> 1));
    Init(k << 1 | 1, ((l + r) >> 1) + 1, r);
  }
  void Update(int k, int l, int r, int i, int j, long long d) {
    if (l > j || r < i) return;
    if (l == r) {
      st[k].lcm = gcd(st[k].lcm, d);
      st[k].sum = st[k].lcm % BASE;
      return;
    }
    if (i <= l && r <= j) {
      if (st[k].lcm > d ||
          (st[k].lcm <= d && (st[k].lcm == 0 || (d % st[k].lcm) != 0))) {
        Update(k << 1, l, ((l + r) >> 1), i, j, d);
        Update(k << 1 | 1, ((l + r) >> 1) + 1, r, i, j, d);
        st[k].lcm = getLCM(st[k << 1].lcm, st[k << 1 | 1].lcm);
        st[k].sum = Add(st[k << 1].sum, st[k << 1 | 1].sum);
      }
      return;
    }
    Update(k << 1, l, ((l + r) >> 1), i, j, d);
    Update(k << 1 | 1, ((l + r) >> 1) + 1, r, i, j, d);
    st[k].lcm = getLCM(st[k << 1].lcm, st[k << 1 | 1].lcm);
    st[k].sum = Add(st[k << 1].sum, st[k << 1 | 1].sum);
  }
  long long Query(int k, int l, int r, int i, int j) {
    if (l > j || r < i) return 0;
    if (i <= l && r <= j) return st[k].sum;
    return Add(Query(k << 1, l, ((l + r) >> 1), i, j),
               Query(k << 1 | 1, ((l + r) >> 1) + 1, r, i, j));
  }
} ST;
void DFS(int u) {
  x[u] = ++timer;
  V[timer] = u;
  sz[u] = 1;
  for (int v : adj[u]) {
    if (v == p[u][0]) continue;
    p[v][0] = u;
    h[v] = h[u] + 1;
    DFS(v);
    sz[u] += sz[v];
  }
  y[u] = timer;
}
void getAns(int u) {
  for (int v : adj[u])
    if (v != p[u][0]) getAns(v);
  if (a[u] != 0) ST.Update(1, 1, n, x[u], y[u], a[u]);
  long long val = ST.Query(1, 1, n, x[u], y[u]);
  answer = Add(answer, val);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n;
  for (int i = 1; i <= n; ++i) cin >> a[i];
  for (int i = 1; i < n; ++i) {
    int u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  timer = 0;
  ST.Init(1, 1, n);
  DFS(1);
  getAns(1);
  cout << answer;
  return 0;
}
