#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; for (int i = 0; i < n; i++) { int lf = i, rg = n+1; while (rg - lf > 1) { int m = (lf + rg) / 2; if (st.query(i, m) == 1) rg = m; else lf = m; } ans += n+1 - rg; } cout << ans << "\n"; return 0; }