// Ragnar // divide and conquer solution #define _GLIBCXX_DEBUG #include #include #include using namespace std; using ll = long long; vector a; unordered_set ans; ll gcd(ll a, ll b) { return a == 0 ? b : gcd(b % a, a); } void solve(int l, int r) { if(r == l) return; if(r == l + 1) { ans.insert(a[l]); return; } int m = (l + r) / 2; vector left, right; left.push_back(a[m - 1]); for(int i = m - 2; i >= l; --i) { auto g = gcd(left.back(), a[i]); if(g != left.back()) { left.push_back(g); // if(g == 1) break; } } right.push_back(a[m]); for(int i = m + 1; i < r; ++i) { auto g = gcd(right.back(), a[i]); if(g != right.back()) { right.push_back(g); // if(g == 1) break; } } // now add all gcd's of pairs from left and right for(auto a : left) for(auto b : right) ans.insert(gcd(a, b)); solve(l, m); solve(m, r); } int main() { ios::sync_with_stdio(false); cin.tie(NULL); int n; cin >> n; a.resize(n); for(auto &x : a) cin >> x; solve(0, n); cout << ans.size() << '\n'; return 0; }