#![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(1000000); 'outer: for i in 0..t { let x = read::(); let org: i64 = factorize(x, &primes).values().map(|&x| x + 1).product(); for cand in 2..20 { let cur: i64 = factorize(x * cand, &primes) .values() .map(|&x| x + 1) .product(); if cur == 2 * org { debug!(cand); println!("{}", x * cand); continue 'outer; } } } } fn factorize(mut num: i64, primes: &Vec) -> std::collections::HashMap { // max_primes >= (num)^(1/2) 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() }