#ifndef LOCAL #pragma GCC optimize("O3") #endif #include using namespace std; #define sim template < class c #define ris return * this #define mor > muu & operator << ( #define R22(r) sim > typename \ enable_if<1 r sizeof dud(0), muu&>::type operator<<( c g) { sim > struct rge { c b, e; }; sim > rge range(c h, c n) { return {h, n}; } sim > auto dud(c * r) -> decltype(cerr << *r); sim > char dud(...); struct muu { #ifdef LOCAL stringstream a; ~muu() { cerr << a.str() << endl; } R22(<) a << boolalpha << g; ris; } R22(==) ris << range(begin(g), end(g)); } sim, class b mor pair < b, c> r) { ris << "(" << r.first << ", " << r.second << ")"; } sim mor rge u) { a << "["; for (c i = u.b; i != u.e; ++i) *this << ", " + 2 * (i == u.b) << *i; ris << "]"; } #else sim mor const c&) { ris; } #endif muu & operator()() { ris; } }; #define imie(r...) "[" #r ": " << (r) << "] " #define debug (muu() << __FUNCTION__ << "#" << __LINE__ << ": ") const int N = 2e5 + 7; const int M = (1 << 18); const int inf = 1e9 + 7; pair D[2 * M]; int n; int tab[N]; const int mod = 1e9 + 7; long long wynik = 0; vector> lewo[N]; vector> prawo[N]; vector> combine(const vector> &t, int val, int i) { vector> res; for (int i = 0; i < (int) t.size(); ++i) { int nv = __gcd(val, t[i].first); if (!res.empty() && res.back().first == nv) { } else { res.push_back({nv, t[i].second}); } } if (!res.empty() && res.back().first == val); else res.push_back({val, i}); return res; } pair query(int a, int b) { a += M; b += M; pair res = max(D[a], D[b]); while (a / 2 != b / 2) { if (a % 2 == 0) res = max(res, D[a + 1]); if (b % 2 == 1) res = max(res, D[b - 1]); a /= 2; b /= 2; } return res; } inline int przeciecie(int pa, int ka, int pb, int kb) { pa = max(pa, pb); ka = min(ka, kb); return max(0, ka - pa + 1); } void jebaj(int a, int b) { if (a > b) return; pair qq = query(a, b); int s = qq.second; long long aux = 0; if (b - s > s - a) { // po lewej for (int i = a; i <= s; ++i) { int last = i; for (auto &u : prawo[i]) { long long pom = przeciecie(last, u.second, s, b); pom = (pom * u.first) % mod; aux += pom; last = u.second + 1; } } } else { // po prawej for (int i = s; i <= b; ++i) { int last = i; for (auto &u : lewo[i]) { long long pom = przeciecie(u.second, last, a, s); pom = (pom * u.first) % mod; aux += pom; last = u.second - 1; } } } aux %= mod; wynik += (aux * tab[s]) % mod; jebaj(a, s - 1); jebaj(s + 1, b); } int main() { ios_base::sync_with_stdio(0); cin >> n; for (int i = 1; i <= n; ++i) cin >> tab[i]; for (int i = 1; i <= n; ++i) { D[M + i] = {tab[i], i}; } for (int i = M - 1; i > 0; --i) D[i] = max(D[2 * i], D[2 * i + 1]); for (int i = 1; i <= n; ++i) { lewo[i] = combine(lewo[i - 1], tab[i], i); } for (int i = n; i > 0; --i) { prawo[i] = combine(prawo[i + 1], tab[i], i); } for (int i = 1; i <= n; ++i) { reverse(lewo[i].begin(), lewo[i].end()); reverse(prawo[i].begin(), prawo[i].end()); } jebaj(1, n); wynik %= mod; cout << wynik << endl; return 0; }