#include<bits/stdc++.h>
using namespace std;


const int N = 2e5 + 5, M = 19, MOD = 1e9 + 7;


int n, a[N], step[N], dp[M][N], l[N], r[N];
vector < pair < int, int > > ri[N], le[N];

inline int get(int l, int r){
    int x = step[r - l + 1];
    return __gcd(dp[x][l], dp[x][r - (1 << x) + 1]);
}

int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    for(int i = 2; i < N; i++){
        step[i] = step[i >> 1] + 1;
    }
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        dp[0][i] = a[i];
    }
    vector < int > st;
    a[0] = 2e9;
    st.push_back(0);
    for(int i = 1; i <= n; i++){
        while(a[st.back()] < a[i]){
            st.pop_back();
        }
        l[i] = st.back();
        st.push_back(i);
    }
    st.clear();
    a[n + 1] = 2e9;
    st.push_back(n + 1);
    for(int i = n; i >= 1; i--){
        while(a[st.back()] <= a[i]){
            st.pop_back();
        }
        r[i] = st.back();
        st.push_back(i);
    }
    for(int i = 1; i <= step[n]; i++){
        for(int j = 1; j + (1 << i) - 1 <= n; j++){
            dp[i][j] = __gcd(dp[i - 1][j], dp[i - 1][j + (1 << (i - 1))]);
        }
    }
    for(int i = 1; i <= n; i++){
        int j = i;
        while(j <= n){
            int cur_val = get(i, j), l = j, r = n;
            while(l < r){
                int mid = (r + l + 1) >> 1;
                if(get(i, mid) == cur_val){
                    l = mid;
                }
                else{
                    r = mid - 1;
                }
            }
            ri[i].push_back(make_pair(cur_val, l));
            j = l + 1;
        }
    }
    for(int i = n; i >= 1; i--){
        int j = i;
        while(j >= 1){
            int cur_val = get(j, i), l = 1, r = j;
            while(l < r){
                int mid = (r + l) >> 1;
                if(get(mid, i) == cur_val){
                    r = mid;
                }
                else{
                    l = mid + 1;
                }
            }
            le[i].push_back(make_pair(cur_val, l));
            j = l - 1;
        }
    }
    long long ans = 0;
    for(int i = 1; i <= n; i++){
        if(i - l[i] < r[i] - i){
            //cout << "LEFT: " << i << "\n";
            int L = l[i]+1;
            int R = r[i]-1;
            for(int j = i; j > l[i]; j--){
                int lstR = j;
                for(auto it : ri[j]){
                    int pos = it.second;
                    int val = it.first;
                    ans += a[i] * 1LL * val % MOD * 1LL * (min(R, pos) - max(i,lstR) + 1) % MOD;
                    ans %= MOD;
                    lstR = pos+1;
                    if (pos >= R)
                        break;
                }
            }
        } else {
            int L = l[i]+1;
            int R = r[i]-1;
            //cout << "RIGHT: " << i << " " << L << " " << R << "\n";
            for (int j = i; j < r[i]; j++){
                int lstL = j;
                for (auto it : le[j]){
                    int pos = it.second;
                    int val = it.first;
                    //cout << i << " " << j << " " << lstL << " " << pos << " " << val << "\n";
                    ans += a[i] * 1LL * val % MOD * 1LL * (min(i, lstL) - max(L, pos) + 1) % MOD;
                    ans %= MOD;
                    //cout << "CURANS: " << ans << "\n";
                    lstL = pos-1;
                    if (pos <= L)
                        break;
                }
            }
        }
    }
    cout << ans;
}

