#include #include #include #include #include #include #include #include #include #include #include #include #include #define repd(i,a,b) for (int i=(int)(a);i<(int)(b);i++) #define rep(i,n) repd(i,0,n) #define all(x) (x).begin(),(x).end() #define mod 1000000007 #define inf 2000000007 #define mp make_pair #define pb push_back typedef long long ll; using namespace std; template inline void output(T a, int p) { if(p) cout << fixed << setprecision(p) << a << "\n"; else cout << a << "\n"; } // end of template vector dec(int y){ vector ret; ret.pb(1); for(int i = 2; i * i <= y; i++){ if(y % i == 0){ ret.pb(i); if(i != y / i) ret.pb(y / i); } } sort(all(ret)); reverse(all(ret)); return ret; } template inline void voutput(T &v){ rep(i, v.size()){ if (i) cout << " " << v[i]; else cout << v[i]; } cout << endl; } int main() { cin.tie(0); ios::sync_with_stdio(0); // source code int N; cin >> N; vector X(1000001, 0); vector Y(N); vector ret(1000001, 1); rep(i, N){ int x; cin >> x; X[x] = 1; Y[i] = x; } sort(all(Y)); int ans = 1; rep(i, N){ vector D = dec(Y[i]); // cout << Y[i] << ": "; // voutput(D); for(int d: D){ if(Y[i] == 1) break; if(X[d] == 1){ ret[Y[i]] = max(ret[Y[i]], ret[d] + 1); } } // cout << Y[i] << ", " << ret[Y[i]] << endl; ans = max(ans, ret[Y[i]]); } output(ans, 0); return 0; }