/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 3ms 284.0 KiB
#2 Accepted 2ms 284.0 KiB
#3 Accepted 7ms 532.0 KiB
#4 Accepted 7ms 532.0 KiB
#5 Accepted 58ms 516.0 KiB
#6 Accepted 41ms 604.0 KiB
#7 Accepted 2ms 284.0 KiB
#8 Accepted 3ms 532.0 KiB
#9 Accepted 251ms 568.0 KiB
#10 Accepted 603ms 824.0 KiB
#11 Accepted 101ms 660.0 KiB
#12 Accepted 8ms 640.0 KiB

Code

// Author: @Drydock
use std::io::{self, Read};

fn main() {
    solve();
}

fn solve() {
    let mut s = String::new();
    io::stdin().read_to_string(&mut s).unwrap();
    let mut it = I::new(&s);
    let t: usize = it.n();
    let mut o = String::new();
    for _ in 0..t {
        let mut x: u64 = it.n();
        let mut k: u64 = it.n();
        let mut v: Vec<(u64, u64)> = Vec::new();
        let mut n = x;
        let mut c = 0;
        while n % 2 == 0 {
            c += 1;
            n /= 2;
        }
        if c > 0 { v.push((2, c)); c = 0; }
        let mut i = 3;
        while i * i <= n {
            if n % i == 0 {
                c = 0;
                while n % i == 0 {
                    c += 1;
                    n /= i;
                }
                v.push((i, c));
            }
            i += 2;
        }
        if n > 1 { v.push((n, 1)); }
        if v.is_empty() { v.push((x, 1)); }
        v.sort_by_key(|p| p.0);
        let mut e0 = v[0].1;
        let mut sum: u64 = 0;
        for &(_, e) in &v { sum += e; }
        let pairs = sum - e0;
        if k >= 2 && v.len() > 1 {
            let mut p2 = k / 2;
            if p2 >= pairs {
                e0 += pairs;
                v.truncate(1);
                k -= pairs * 2;
            } else {
                let mut r = p2;
                let mut idx = v.len();
                while r > 0 {
                    idx -= 1;
                    let take = if v[idx].1 <= r { v[idx].1 } else { r };
                    r -= take;
                    e0 += take;
                    v[idx].1 -= take;
                    if v[idx].1 == 0 { v.remove(idx); }
                    if idx == 0 { break; }
                }
                k -= p2 * 2;
            }
        }
        if k > 0 && k % 2 == 1 {
            e0 += 1;
        }
        v[0].1 = e0;
        let mut ans: u128 = 1;
        for &(p, e) in &v {
            let pp = p as u128;
            for _ in 0..e { ans *= pp; }
        }

        o.push_str(&format!("{}\n", ans));
    }
    print!("{}", o);
}

struct I<'a> { w: std::str::SplitWhitespace<'a> }

impl<'a> I<'a> {
    fn new(s: &'a str) -> Self { Self { w: s.split_whitespace() } }
    fn n<T: std::str::FromStr>(&mut self) -> T { self.w.next().unwrap().parse().ok().unwrap() }
}

Information

Submit By
Type
Submission
Problem
P1194 D. Roy and Prime Game
Contest
Happy New Year 2026
Language
Rust 2021 (Rust 1.75.0)
Submit At
2026-01-06 15:29:00
Judged At
2026-01-06 15:29:01
Judged By
Score
100
Total Time
603ms
Peak Memory
824.0 KiB