const LIMIT: usize = 1e6 as usize; 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 used_cnt = vec![0usize; LIMIT + 1]; for i in 0..n { for j in 1..=(a[i] as f64).sqrt().floor() as usize { if a[i] % j == 0 { let l = j; let r = a[i]/j; used_cnt[l] += 1; if l != r { used_cnt[r] += 1; } } } } let mut result = vec![0usize; n]; for i in (1..=LIMIT).rev() { if used_cnt[i] == 0 { continue; } let mut idx = n-used_cnt[i]; while idx < n && result[idx] == 0 { result[idx] = i; idx += 1; } } for &v in result.iter() { println!("{}", v); } }