fn read() -> Vec { let mut s = String::new(); use std::io::*; std::io::stdin().read_to_string(&mut s).unwrap(); let mut it = s.trim().split_whitespace(); it.next(); it.flat_map(|s| s.parse()).collect() } const MOD: usize = 1_000_000_007; fn pow(mut r: usize, mut n: usize) -> usize { let mut t = 1; while n > 0 { if n & 1 == 1 { t = t * r % MOD; } r = r * r % MOD; n >>= 1; } t } fn main() { let a = read(); let w = *a.iter().max().unwrap(); let mut p = (0..=w).collect::>(); for i in (2..).take_while(|p| p * p <= w) { if p[i] == i { let mut j = i * i; while let Some(p) = p.get_mut(j) { *p = i; j += i; } } } let factorize = |mut n: usize| -> Vec<(usize, usize)> { let mut f = vec![]; while n > 1 { let p = p[n]; let mut c = 0; while n % p == 0 { n /= p; c += 1; } f.push((p, c)); } f }; let mut dp = vec![(0, 0); w + 1]; for a in a.iter() { for (p, c) in factorize(*a) { let po = &mut dp[p]; if c > po.0 { *po = (c, po.0); } else if c > po.1 { po.1 = c; } } } let all = a.iter().fold(1, |s, a| s * *a % MOD); let lcm = dp.iter().enumerate().fold(1, |s, (k, p)| s * k.pow(p.0 as u32) % MOD); use std::io::Write; let out = std::io::stdout(); let mut out = std::io::BufWriter::new(out.lock()); for a in a.iter() { let all = all * pow(*a, MOD - 2); let mut lcm = lcm; for (p, c) in factorize(*a) { let (x, y) = dp[p]; if c == x { lcm = lcm * pow(pow(p, MOD - 2), x - y) % MOD; } } let ans = (all - lcm + MOD) % MOD; writeln!(out, "{}", ans).ok(); } }