結果

問題 No.811 約数の個数の最大化
ユーザー phsplsphspls
提出日時 2020-06-19 11:42:29
言語 Rust
(1.77.0 + proconio)
結果
AC  
実行時間 400 ms / 2,000 ms
コード長 1,930 bytes
コンパイル時間 14,010 ms
コンパイル使用メモリ 400,816 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-07-03 13:15:16
合計ジャッジ時間 15,649 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 1 ms
5,248 KB
testcase_02 AC 328 ms
5,248 KB
testcase_03 AC 1 ms
5,376 KB
testcase_04 AC 1 ms
5,376 KB
testcase_05 AC 3 ms
5,376 KB
testcase_06 AC 9 ms
5,376 KB
testcase_07 AC 15 ms
5,376 KB
testcase_08 AC 113 ms
5,376 KB
testcase_09 AC 126 ms
5,376 KB
testcase_10 AC 64 ms
5,376 KB
testcase_11 AC 333 ms
5,376 KB
testcase_12 AC 48 ms
5,376 KB
testcase_13 AC 395 ms
5,376 KB
testcase_14 AC 400 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

use std::collections::HashMap;

fn get_primes(n: usize) -> Vec<usize> {
    let mut flgs = vec![true; n+1];
    flgs[0] = false;
    flgs[1] = false;
    let lim: usize = (n as f64).sqrt().ceil() as usize + 1;
    for i in 2..lim {
        if !flgs[i] { continue; }
        for j in i..=(n / i) {
            flgs[i*j] = false;
        }
    }
    flgs.iter().enumerate()
        .filter(|pair| *pair.1)
        .map(|pair| pair.0)
        .collect()
}

//TODO
fn main() {
    let mut nk = String::new();
    std::io::stdin().read_line(&mut nk).ok();
    let nk: Vec<usize> = nk.trim().split_whitespace().map(|s| s.parse().unwrap()).collect();
    let n = nk[0];
    let k = nk[1];

    let mut divisors: Vec<(usize, usize)> = vec![(0, 0); n+1];
    let primes: Vec<usize> = get_primes(n);
    for i in 2..=n {
        let mut num = i;
        let mut idx = 0;
        let mut mapping: HashMap<usize, usize> = HashMap::new();
        while num > 1 {
            if num % primes[idx] == 0 {
                 num /= primes[idx];
                 if let Some(x) = mapping.get_mut(&primes[idx]) {
                     *x += 1;
                 } else {
                     mapping.insert(primes[idx], 1);
                 }
            } else {
                idx += 1;
            }
        }
        divisors[i] = (
              mapping.iter().map(|pair| pair.1).sum::<usize>()
            , mapping.iter().map(|pair| pair.1 + 1).fold(1, |acc, i| acc * i)
        );
    }
    let mut max_div: usize = 0;
    let mut result: usize = 0;
    let mut base: Vec<usize> = vec![];
    for i in 2..n {
        if divisors[i].0 == k && n % i == 0 {
            base.push(i);
        }
        for b in &base {
            if i % b == 0 {
                if divisors[i].1 > max_div {
                    max_div = divisors[i].1;
                    result = i;
                }
            }
        }
    }
    println!("{}", result);
}
0