const LIMIT: usize = 300000usize; fn main() { let mut n = String::new(); std::io::stdin().read_line(&mut n).ok(); let n: usize = n.trim().parse().unwrap(); let mut a = String::new(); std::io::stdin().read_line(&mut a).ok(); let a: Vec = a.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); let mut dp = vec![0usize; LIMIT+1]; dp[a[0]] = 1; for &v in a.iter().skip(1) { for j in 1..=(v as f64).sqrt() as usize { if v % j == 0 { if v == 1 { dp[v] = 1; } else { dp[v] = dp[v].max(dp[j] + 1); } if j > 1 { dp[v] = dp[v].max(dp[v / j] + 1); } } } } println!("{}", dp.iter().max().unwrap()); }