#include #include #include int main() { constexpr int A = 300001; constexpr int L = 18; std::vector primes; { std::vector sieve(A, true); for (int i = 2; i != A; i += 1) { if (!sieve[i]) continue; primes.push_back(i); for (int j = i; j < A; j += i) sieve[j] = false; } } int n; std::cin >> n; std::vector a(n); for (int &e : a) std::cin >> e; std::vector> dp(A, std::vector(L, -1)); for (int i = 0; i != A; i += 1) dp[i][0] = n; std::vector> idx(A, std::vector()); for (int i = 0; i != n; i += 1) idx[a[i]].push_back(i); for (int i = A; --i != 0;) { for (const int e : primes) { if (i * e >= A) break; for (int j = 0; j != L; j += 1) dp[i][j] = std::max(dp[i][j], dp[i * e][j]); } for (const int j : idx[i]) { *std::prev(std::upper_bound(dp[i].rbegin(), dp[i].rend(), j)) = j; } } int ans = 0; for (int i = 0; i != A; i += 1) { for (int j = 0; j != L; j += 1) { if (dp[i][j] != -1) ans = std::max(ans, j); } } std::cout << ans << std::endl; return 0; }