#include using namespace std; template struct SparseTable { vector> dat; vector lookup; using Func = function; Func f; T e; SparseTable(Func f, T e) : f(f), e(e) {} SparseTable(const vector &v, Func f, T e) : f(f), e(e) { build(v); } void build(const vector &v) { int sz = v.size(), b = 0; while ((1 << b) <= sz) b++; int n = 1 << b; dat.assign(b, vector(n, e)); for (int i = 0; i < n; i++) dat[0][i] = v[i]; for (int i = 1; i < b; i++) { int d = 1 << i; for (int j = 0; j + d <= n; j++) { dat[i][j] = f(dat[i-1][j], dat[i-1][j+d/2]); } } lookup.resize(n+1, 0); for (int i = 2; i <= n; i++) { lookup[i] = lookup[i/2] + 1; } } // query : [l, r) T query(int l, int r) { int b = lookup[r - l]; return f(dat[b][l], dat[b][r-(1<> n; using D = long long; function g = [&](D a, D b) { if (b == 0LL) return a; if (a % b) return g(b, a % b); return b; }; vector a(n); for (auto &x: a) cin >> x; a.emplace_back(1); SparseTable st(a, g, 0); long long ans = 0; int rg = 1; for (int i = 0; i < n; i++) { long long curr = st.query(i, rg); while (curr != 1 && rg < n) curr = g(curr, a[rg++]); ans += n - rg + (curr == 1); if (i+1 == rg) rg++; } cout << ans << "\n"; return 0; }