Submission #73319322


Source Code Expand

use proconio::input;
use std::collections::HashMap;

const MOD: u64 = 998244353;
const MAX_A: usize = 10_000_000;

static mut SPF: Vec<usize> = Vec::new();
static INIT: std::sync::Once = std::sync::Once::new();

fn init_spf() {
    unsafe {
        INIT.call_once(|| {
            let mut spf = vec![0; MAX_A + 1];
            let mut primes = Vec::with_capacity(664579);
            for i in 2..=MAX_A {
                if spf[i] == 0 {
                    spf[i] = i;
                    primes.push(i);
                }
                for &p in &primes {
                    let ip = i * p;
                    if ip > MAX_A {
                        break;
                    }
                    spf[ip] = p;
                    if p == spf[i] {
                        break;
                    }
                }
            }
            SPF = spf;
        });
    }
}

fn factorize(x: usize) -> Vec<(usize, u32)> {
    if x == 1 {
        return Vec::new();
    }
    unsafe {
        let mut factors = Vec::new();
        let mut n = x;
        while n > 1 {
            let p = SPF[n];
            let mut cnt = 0;
            while n % p == 0 {
                n /= p;
                cnt += 1;
            }
            factors.push((p, cnt));
        }
        factors
    }
}

fn mod_pow(mut base: u64, mut exp: u32, modulo: u64) -> u64 {
    let mut result = 1;
    base %= modulo;
    while exp > 0 {
        if exp & 1 == 1 {
            result = (result * base) % modulo;
        }
        base = (base * base) % modulo;
        exp >>= 1;
    }
    result
}

fn mod_inv(a: u64, modulo: u64) -> u64 {
    mod_pow(a, modulo as u32 - 2, modulo)
}

fn main() {
    init_spf();
    input! {
        t: usize,
    }
    for _ in 0..t {
        input! {
            n: usize,
            a: [usize; n],
        }

        let mut factors = Vec::with_capacity(n);
        let mut prime_exponents: HashMap<usize, Vec<u32>> = HashMap::new();

        for &x in &a {
            let f = factorize(x);
            for &(p, e) in &f {
                prime_exponents.entry(p).or_default().push(e);
            }
            factors.push(f);
        }

        let mut max1 = HashMap::new();
        let mut max2 = HashMap::new();
        let mut cnt_max = HashMap::new();

        for (&p, exponents) in &prime_exponents {
            let mut sorted = exponents.clone();
            sorted.sort_unstable_by(|a, b| b.cmp(a));
            let m1 = sorted[0];
            let c1 = sorted.iter().take_while(|&&x| x == m1).count() as u32;
            let m2 = if sorted.len() > 1 && sorted[1] < m1 {
                sorted[1]
            } else {
                0
            };
            max1.insert(p, m1);
            cnt_max.insert(p, c1);
            max2.insert(p, m2);
        }

        let mut total_lcm = 1u64;
        for (&p, &exp) in &max1 {
            total_lcm = (total_lcm * mod_pow(p as u64, exp, MOD)) % MOD;
        }

        let mut answers = Vec::with_capacity(n);
        for k in 0..n {
            let mut res = total_lcm;
            for &(p, e) in &factors[k] {
                if e == max1[&p] && cnt_max[&p] == 1 {
                    let old_power = mod_pow(p as u64, max1[&p], MOD);
                    let new_power = mod_pow(p as u64, max2[&p], MOD);
                    let inv_old = mod_inv(old_power, MOD);
                    res = (res * inv_old) % MOD;
                    res = (res * new_power) % MOD;
                }
            }
            answers.push(res);
        }

        println!("{}", answers.iter().map(|x| x.to_string()).collect::<Vec<_>>().join(" "));
    }
}

Submission Info

Submission Time
Task E - Many LCMs
User memoka
Language Rust (rustc 1.89.0)
Score 475
Code Size 3766 Byte
Status AC
Exec Time 362 ms
Memory 146428 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 475 / 475
Status
AC × 1
AC × 25
Set Name Test Cases
Sample 00_sample_01.txt
All 00_sample_01.txt, 01_large_t_01.txt, 01_large_t_02.txt, 01_large_t_03.txt, 02_large_n_01.txt, 02_large_n_02.txt, 02_large_n_03.txt, 03_prime_01.txt, 03_prime_02.txt, 03_prime_03.txt, 03_prime_04.txt, 03_prime_05.txt, 03_prime_06.txt, 04_small_prime_factor_01.txt, 04_small_prime_factor_02.txt, 04_small_prime_factor_03.txt, 04_small_prime_factor_04.txt, 04_small_prime_factor_05.txt, 04_small_prime_factor_06.txt, 05_large_value_01.txt, 05_large_value_02.txt, 05_large_value_03.txt, 05_large_value_04.txt, 05_large_value_05.txt, 05_large_value_06.txt
Case Name Status Exec Time Memory
00_sample_01.txt AC 64 ms 85144 KiB
01_large_t_01.txt AC 267 ms 85156 KiB
01_large_t_02.txt AC 285 ms 85180 KiB
01_large_t_03.txt AC 296 ms 85116 KiB
02_large_n_01.txt AC 163 ms 98424 KiB
02_large_n_02.txt AC 166 ms 108028 KiB
02_large_n_03.txt AC 169 ms 128740 KiB
03_prime_01.txt AC 178 ms 85168 KiB
03_prime_02.txt AC 195 ms 145536 KiB
03_prime_03.txt AC 200 ms 145416 KiB
03_prime_04.txt AC 198 ms 145424 KiB
03_prime_05.txt AC 181 ms 113176 KiB
03_prime_06.txt AC 180 ms 113140 KiB
04_small_prime_factor_01.txt AC 362 ms 85132 KiB
04_small_prime_factor_02.txt AC 152 ms 128788 KiB
04_small_prime_factor_03.txt AC 154 ms 128864 KiB
04_small_prime_factor_04.txt AC 155 ms 128724 KiB
04_small_prime_factor_05.txt AC 263 ms 104716 KiB
04_small_prime_factor_06.txt AC 266 ms 104600 KiB
05_large_value_01.txt AC 303 ms 84992 KiB
05_large_value_02.txt AC 171 ms 85072 KiB
05_large_value_03.txt AC 187 ms 135484 KiB
05_large_value_04.txt AC 206 ms 146428 KiB
05_large_value_05.txt AC 236 ms 108236 KiB
05_large_value_06.txt AC 180 ms 113340 KiB