Submission #62985015


Source Code Expand

#![allow(unused)]

fn main() {
    let sieve = SieveOfEratosthenes::new(1_000_000);
    let inp = readv::<u64>();
    let (a, b) = (inp[0], inp[1]);
    let g = gcd(a, b);
    if g > 1 {
        println!("{}", sieve.factorize(g).len() + 1);
    } else {
        println!("1");
    }
}

fn gcd(a: u64, b: u64) -> u64 {
    if b == 0 {
        a
    } else {
        gcd(b, a % b)
    }
}

struct SieveOfEratosthenes {
    primes: Vec<u64>,
}

impl SieveOfEratosthenes {
    fn new(v: usize) -> Self {
        let mut is_prime = vec![true; v + 1];
        let mut primes = vec![];
        for i in 2..=v {
            if is_prime[i] {
                primes.push(i as u64);
                for j in ((i * i)..=v).step_by(i) {
                    is_prime[j] = false;
                }
            }
        }
        Self { primes }
    }

    fn factorize(&self, mut x: u64) -> Vec<(u64, u64)> {
        assert!(x > 1);
        let mut res = vec![];
        for &p in self.primes.iter() {
            let mut exp = 0;
            while x % p == 0 {
                exp += 1;
                x = x / p;
            }
            if exp > 0 {
                res.push((p, exp))
            }
            if p * p > x {
                break;
            }
        }
        if x > 1 {
            res.push((x, 1));
        }
        res
    }
}

fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().parse().ok().unwrap()
}

fn readv<T: std::str::FromStr>() -> Vec<T> {
    read::<String>()
        .split_ascii_whitespace()
        .map(|t| t.parse().ok().unwrap())
        .collect()
}

fn reads() -> Vec<char> {
    read::<String>().chars().collect()
}

fn mapv<T, S, F: Fn(&T) -> S>(arr: &Vec<T>, f: F) -> Vec<S> {
    arr.iter().map(f).collect()
}

fn join<T: ToString>(arr: &[T], sep: &str) -> String {
    arr.iter()
        .map(|x| x.to_string())
        .collect::<Vec<String>>()
        .join(sep)
}

Submission Info

Submission Time
Task D - Disjoint Set of Common Divisors
User amoshuangyc
Language Rust (rustc 1.70.0)
Score 400
Code Size 2073 Byte
Status AC
Exec Time 6 ms
Memory 3612 KiB

Judge Result

Set Name All Sample
Score / Max Score 400 / 400 0 / 0
Status
AC × 26
AC × 3
Set Name Test Cases
All sample_01, sample_02, sample_03, testcase_01, testcase_02, testcase_03, testcase_04, testcase_05, testcase_06, testcase_07, testcase_08, testcase_09, testcase_10, testcase_11, testcase_12, testcase_13, testcase_14, testcase_15, testcase_16, testcase_17, testcase_18, testcase_19, testcase_20, testcase_21, testcase_22, testcase_23
Sample sample_01, sample_02, sample_03
Case Name Status Exec Time Memory
sample_01 AC 5 ms 3448 KiB
sample_02 AC 5 ms 3520 KiB
sample_03 AC 5 ms 3504 KiB
testcase_01 AC 5 ms 3508 KiB
testcase_02 AC 6 ms 3532 KiB
testcase_03 AC 6 ms 3604 KiB
testcase_04 AC 5 ms 3384 KiB
testcase_05 AC 5 ms 3604 KiB
testcase_06 AC 5 ms 3612 KiB
testcase_07 AC 5 ms 3472 KiB
testcase_08 AC 6 ms 3528 KiB
testcase_09 AC 5 ms 3576 KiB
testcase_10 AC 5 ms 3484 KiB
testcase_11 AC 5 ms 3512 KiB
testcase_12 AC 5 ms 3540 KiB
testcase_13 AC 6 ms 3520 KiB
testcase_14 AC 5 ms 3484 KiB
testcase_15 AC 5 ms 3552 KiB
testcase_16 AC 5 ms 3584 KiB
testcase_17 AC 5 ms 3564 KiB
testcase_18 AC 5 ms 3520 KiB
testcase_19 AC 5 ms 3512 KiB
testcase_20 AC 5 ms 3396 KiB
testcase_21 AC 5 ms 3604 KiB
testcase_22 AC 6 ms 3516 KiB
testcase_23 AC 6 ms 3572 KiB