#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
const int MOD = 1000000007;
// Recursive Double DP with memoization:
// F(i, g) = F(i+1, g) + F(i+1, gcd(g, a[i])) * fval[a[i]]
// Base: i == n: return (g > 0 ? inv[g] : 0)
int n, A;
vector<int> a;
vector<int> phi;
vector<int64> fval, invv;
vector<unordered_map<int,int64>> memo;
int64 mod_pow(int64 x, int64 e) {
int64 r = 1;
while (e) {
if (e & 1) r = r * x % MOD;
x = x * x % MOD;
e >>= 1;
}
return r;
}
int64 dfs(int idx, int g) {
if (idx == n) {
return g > 0 ? invv[g] : 0;
}
auto &mp = memo[idx];
auto it = mp.find(g);
if (it != mp.end()) return it->second;
// Skip a[idx]
int64 res = dfs(idx + 1, g);
// Take a[idx]
int ng = (g == 0 ? a[idx] : __gcd(g, a[idx]));
res = (res + dfs(idx + 1, ng) * fval[a[idx]] % MOD) % MOD;
return mp[g] = res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
a.resize(n);
A = 0;
for (int i = 0; i < n; i++) {
cin >> a[i];
A = max(A, a[i]);
}
// Compute phi
phi.resize(A+1);
iota(phi.begin(), phi.end(), 0);
for (int i = 2; i <= A; i++) {
if (phi[i] == i) {
for (int j = i; j <= A; j += i)
phi[j] -= phi[j] / i;
}
}
// Compute inverses
invv.resize(A+1);
for (int i = 1; i <= A; i++)
invv[i] = mod_pow(i, MOD - 2);
// Compute fval = a_i * inv(phi[a_i]) % MOD
fval.resize(A+1);
for (int i = 1; i <= A; i++)
fval[i] = (int64)i * invv[phi[i]] % MOD;
// Prepare memo
memo.assign(n, unordered_map<int,int64>());
for (auto &m : memo) m.reserve(1024);
// Get result from recursion
cout << dfs(0, 0) << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGludDY0ID0gbG9uZyBsb25nOwpjb25zdCBpbnQgTU9EID0gMTAwMDAwMDAwNzsKCi8vIFJlY3Vyc2l2ZSBEb3VibGUgRFAgd2l0aCBtZW1vaXphdGlvbjoKLy8gRihpLCBnKSA9IEYoaSsxLCBnKSArIEYoaSsxLCBnY2QoZywgYVtpXSkpICogZnZhbFthW2ldXQovLyBCYXNlOiBpID09IG46IHJldHVybiAoZyA+IDAgPyBpbnZbZ10gOiAwKQoKaW50IG4sIEE7CnZlY3RvcjxpbnQ+IGE7CnZlY3RvcjxpbnQ+IHBoaTsKdmVjdG9yPGludDY0PiBmdmFsLCBpbnZ2Owp2ZWN0b3I8dW5vcmRlcmVkX21hcDxpbnQsaW50NjQ+PiBtZW1vOwoKaW50NjQgbW9kX3BvdyhpbnQ2NCB4LCBpbnQ2NCBlKSB7CiAgICBpbnQ2NCByID0gMTsKICAgIHdoaWxlIChlKSB7CiAgICAgICAgaWYgKGUgJiAxKSByID0gciAqIHggJSBNT0Q7CiAgICAgICAgeCA9IHggKiB4ICUgTU9EOwogICAgICAgIGUgPj49IDE7CiAgICB9CiAgICByZXR1cm4gcjsKfQoKaW50NjQgZGZzKGludCBpZHgsIGludCBnKSB7CiAgICBpZiAoaWR4ID09IG4pIHsKICAgICAgICByZXR1cm4gZyA+IDAgPyBpbnZ2W2ddIDogMDsKICAgIH0KICAgIGF1dG8gJm1wID0gbWVtb1tpZHhdOwogICAgYXV0byBpdCA9IG1wLmZpbmQoZyk7CiAgICBpZiAoaXQgIT0gbXAuZW5kKCkpIHJldHVybiBpdC0+c2Vjb25kOwoKICAgIC8vIFNraXAgYVtpZHhdCiAgICBpbnQ2NCByZXMgPSBkZnMoaWR4ICsgMSwgZyk7CiAgICAvLyBUYWtlIGFbaWR4XQogICAgaW50IG5nID0gKGcgPT0gMCA/IGFbaWR4XSA6IF9fZ2NkKGcsIGFbaWR4XSkpOwogICAgcmVzID0gKHJlcyArIGRmcyhpZHggKyAxLCBuZykgKiBmdmFsW2FbaWR4XV0gJSBNT0QpICUgTU9EOwoKICAgIHJldHVybiBtcFtnXSA9IHJlczsKfQoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGNpbiA+PiBuOwogICAgYS5yZXNpemUobik7CiAgICBBID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgY2luID4+IGFbaV07CiAgICAgICAgQSA9IG1heChBLCBhW2ldKTsKICAgIH0KCiAgICAvLyBDb21wdXRlIHBoaQogICAgcGhpLnJlc2l6ZShBKzEpOwogICAgaW90YShwaGkuYmVnaW4oKSwgcGhpLmVuZCgpLCAwKTsKICAgIGZvciAoaW50IGkgPSAyOyBpIDw9IEE7IGkrKykgewogICAgICAgIGlmIChwaGlbaV0gPT0gaSkgewogICAgICAgICAgICBmb3IgKGludCBqID0gaTsgaiA8PSBBOyBqICs9IGkpCiAgICAgICAgICAgICAgICBwaGlbal0gLT0gcGhpW2pdIC8gaTsKICAgICAgICB9CiAgICB9CgogICAgLy8gQ29tcHV0ZSBpbnZlcnNlcwogICAgaW52di5yZXNpemUoQSsxKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IEE7IGkrKykKICAgICAgICBpbnZ2W2ldID0gbW9kX3BvdyhpLCBNT0QgLSAyKTsKCiAgICAvLyBDb21wdXRlIGZ2YWwgPSBhX2kgKiBpbnYocGhpW2FfaV0pICUgTU9ECiAgICBmdmFsLnJlc2l6ZShBKzEpOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gQTsgaSsrKQogICAgICAgIGZ2YWxbaV0gPSAoaW50NjQpaSAqIGludnZbcGhpW2ldXSAlIE1PRDsKCiAgICAvLyBQcmVwYXJlIG1lbW8KICAgIG1lbW8uYXNzaWduKG4sIHVub3JkZXJlZF9tYXA8aW50LGludDY0PigpKTsKICAgIGZvciAoYXV0byAmbSA6IG1lbW8pIG0ucmVzZXJ2ZSgxMDI0KTsKCiAgICAvLyBHZXQgcmVzdWx0IGZyb20gcmVjdXJzaW9uCiAgICBjb3V0IDw8IGRmcygwLCAwKSA8PCAnXG4nOwogICAgcmV0dXJuIDA7Cn0K