#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool read(T &ret) {
  char c;
  int sgn;
  if (c = getchar(), c == EOF) return false;
  while (c != '-' && (c < '0' || c > '9')) c = getchar();
  sgn = (c == '-') ? -1 : 1;
  ret = (c == '-') ? 0 : (c - '0');
  while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
  ret *= sgn;
  return true;
}
template <class T>
inline void output(T answer) {
  if (answer < 0) {
    putchar('-');
    answer = -answer;
  }
  if (answer >= 10) output(answer / 10);
  putchar(answer % 10 + '0');
  return;
}
template <class T>
inline T gcd(T m, T n) {
  return n == 0 ? m : gcd(n, m % n);
}
inline long long qmul(long long, long long, long long);
inline long long qpow_qmul(long long, long long, long long);
inline long long mul(long long, long long, long long);
inline long long qpow(long long, long long, long long);
inline long long qpow_mul(long long, long long, long long);
const int N = 1e5 + 6;
const int M = 2e6 + 10;
const long long INF = 1e18 + 1;
const long long mod = 1e9 + 7;
const double PI = acos(-1.0);
const double esp = 1e-8;
long long a[N], ans = 0;
vector<int> g[N];
unordered_map<long long, int> f[N];
void dfs(int cur, int fa) {
  f[cur][a[cur]]++;
  ans = (ans + a[cur]);
  if (ans >= mod) ans -= mod;
  for (auto it : f[fa]) {
    long long gcd_ = gcd(a[cur], it.first);
    f[cur][gcd_] += it.second;
    ans += gcd_ * (it.second) % mod;
    if (ans >= mod) ans -= mod;
  }
  for (auto s : g[cur]) {
    if (s == fa) continue;
    dfs(s, cur);
  }
}
int main() {
  int n, x, y;
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) scanf("%lld", &a[i]);
  for (int i = 1; i <= n - 1; i++) {
    scanf("%d%d", &x, &y);
    g[x].push_back(y);
    g[y].push_back(x);
  }
  dfs(1, 0);
  printf("%lld\n", ans % mod);
  return 0;
}
inline long long mul(long long a, long long b, long long MOD) {
  long long L = a * (b >> 25ll) % MOD * (1ll << 25) % MOD;
  long long R = a * (b & ((1ll << 25) - 1)) % MOD;
  return (L + R) % MOD;
}
inline long long qpow_mul(long long x, long long n, long long MOD) {
  long long ans = 1, a = x % MOD;
  while (n) {
    if (n & 1) {
      ans = mul(ans, a, MOD);
    }
    a = mul(a, a, MOD);
    n >>= 1;
  }
  return ans;
}
inline long long qmul(long long a, long long b, long long MOD) {
  long long ans = 0, x = a;
  while (b) {
    if (b & 1) {
      ans = (ans + x) % MOD;
    }
    x = x * 2 % MOD;
    b >>= 1;
  }
  return ans % MOD;
}
inline long long qpow_qmul(long long x, long long n, long long MOD) {
  long long ans = 1, a = x % MOD;
  while (n) {
    if (n & 1) {
      ans = qmul(ans, a, MOD);
    }
    a = qmul(a, a, MOD);
    n >>= 1;
  }
  return ans;
}
inline long long qpow(long long x, long long n, long long MOD) {
  if (x == 1) return x % MOD;
  long long ans = 1, a = x;
  while (n) {
    if (n & 1) {
      ans = ans * a % MOD;
    }
    a = a * a % MOD;
    n >>= 1;
  }
  return ans;
}
