#include using namespace std; using ll = long long; ll gcd(ll a, ll b) { while (b) a %= b, swap(a, b); return a; } template struct SegmentTree { int n; vector tree; SegmentTree(int _n) : n(_n), tree(2 * n, ident) { } void update(int i, T val) { for (tree[i+n] = val, i = (i+n)/2; i > 0; i /= 2) tree[i] = op(tree[2*i], tree[2*i+1]); } T query(int l, int r) { T lhs = T(ident), rhs = T(ident); for (l += n, r += n; l < r; l >>= 1, r >>= 1) { if ( l&1 ) lhs = op(lhs, tree[l++]); if (!(r&1)) rhs = op(tree[r--], rhs); } return op(l == r ? op(lhs, tree[l]) : lhs, rhs); } }; constexpr int SIZE = 10; int main() { ios::sync_with_stdio(false); cin.tie(NULL); int N; cin >> N; vector A; ll last = -1LL; for (int i = 0; i < N; ++i) { ll v; cin >> v; if (v != last) A.push_back(v); if (A.size() >= 4) { int L = (int)A.size(); if (A[L-4] == A[L-2] && A[L-3] == A[L-1]) A.pop_back(), A.pop_back(); } } N = (int)A.size(); SegmentTree st(A.size()); for (size_t i = 0; i < A.size(); ++i) st.update(i, A[i]); unordered_set gcds; for (int l = 0; l < N; ++l) { ll g = A[l]; for (int r = l; r < N && r - l <= SIZE; ++r) { g = gcd(g, A[r]); gcds.insert(g); gcds.insert(st.query(l, min(N - 1, l + (N-l)*(r-l)/SIZE))); } } cout << gcds.size() << endl; return 0; }