#![allow(unused_imports)] use std::cmp::*; use std::collections::*; use std::io::Write; use std::ops::Bound::*; #[allow(unused_macros)] macro_rules! debug { ($($e:expr),*) => { #[cfg(debug_assertions)] $({ let (e, mut err) = (stringify!($e), std::io::stderr()); writeln!(err, "{} = {:?}", e, $e).unwrap() })* }; } fn main() { let t = read::(); let primes = get_primes(400000); 'outer: for i in 0..t { let x = read::(); let mut cand = 0; for &p in &primes { if x % p != 0 { cand = p; break; } } assert!(cand != 0); let fact = factorize(x, &primes); for (k, v) in fact { cand = min(cand, k.pow(v as u32 + 1)); } debug!(cand); println!("{}", cand * x); } } fn factorize(mut num: i64, primes: &Vec) -> std::collections::HashMap { // max_primes >= (num)^(1/2) let num_org = num; let mut dict = std::collections::HashMap::new(); for &p in primes.iter() { while num % p == 0 { *dict.entry(p).or_insert(0) += 1; num /= p; } if num == 1 { break; } if p * p > num { *dict.entry(num).or_insert(0) += 1; break; } } if num != 1 { dict.insert(num, 1); } dict } fn get_primes(n: i64) -> Vec { let mut is_prime = vec![true; n as usize + 1]; let mut primes = Vec::new(); is_prime[0] = false; is_prime[1] = false; for i in 2..n + 1 { if is_prime[i as usize] { primes.push(i); let mut j = 2 * i; while j <= n { is_prime[j as usize] = false; j += i; } } } primes } fn read() -> T { let mut s = String::new(); std::io::stdin().read_line(&mut s).ok(); s.trim().parse().ok().unwrap() } fn read_vec() -> Vec { read::() .split_whitespace() .map(|e| e.parse().ok().unwrap()) .collect() }