#include <bits/stdc++.h>
using namespace std;
int n;
long long x[100100], ans = 0LL;
unordered_map<long long, int> mp[100100];
vector<int> t[100100];
inline long long gcd(long long a, long long b) {
  if (!a || !b) return a + b;
  return gcd(b, a % b);
}
inline void dfs(int nd, int par = 0) {
  mp[nd][x[nd]] = 1;
  if (par)
    for (auto pli : mp[par]) mp[nd][gcd(x[nd], pli.first)] += pli.second;
  for (auto pli : mp[nd])
    ans = (ans + (pli.first * pli.second) % 1000000007) % 1000000007;
  for (auto nc : t[nd]) {
    if (nc != par) dfs(nc, nd);
  }
}
int main() {
  cin >> n;
  for (int i = (1); i < (n + 1); i++) cin >> x[i];
  int u, v;
  for (int i = (1); i < (n); i++) {
    cin >> u >> v;
    t[u].push_back(v);
    t[v].push_back(u);
  }
  dfs(1);
  cout << ans << '\n';
}
