結果

問題 No.3178 free sort
コンテスト
ユーザー YU Hirose
提出日時 2026-01-10 23:08:34
言語 Rust
(1.92.0 + proconio + num)
結果
WA  
実行時間 -
コード長 1,465 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 26,087 ms
コンパイル使用メモリ 412,116 KB
実行使用メモリ 9,472 KB
最終ジャッジ日時 2026-01-10 23:09:03
合計ジャッジ時間 29,290 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3 WA * 2
other WA * 40
権限があれば一括ダウンロードができます
コンパイルメッセージ
warning: value assigned to `x` is never read
  --> src/main.rs:35:25
   |
35 |             let mut x = 0;
   |                         ^
   |
   = help: maybe it is overwritten before being read?
   = note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default

warning: variable `M` should have a snake case name
 --> src/main.rs:4:9
  |
4 |     let M = 998244353;
  |         ^ help: convert the identifier to snake case: `m`
  |
  = note: `#[warn(non_snake_case)]` (part of `#[warn(nonstandard_style)]`) on by default

ソースコード

diff #
raw source code

use proconio::{input, marker::Chars};
use std::collections::HashMap;
fn main() {
    let M = 998244353;
    input! {
        n: Chars,
    }
    /*
    let s: Vec<i128> = n
        .chars()
        .map(|c| c.to_digit(10).unwrap() as i128)
        .collect();
    */
    let mut s: Vec<i128> = vec![];
    for x in &n {
        s.push(x.to_digit(10).unwrap() as i128);
    }
    let mut count: HashMap<i128, i128> = HashMap::new();
    for x in &s {
        *count.entry(*x).or_insert(0) += 1;
    }
    let mut f: Vec<i128> = vec![1];
    for i in 1..=n.len() {
        f.push((f[f.len() - 1] * i as i128) % M);
    }
    let mut cnt = 0_i128;
    for i in 1..10 {
        let v = count.get(&i).unwrap_or(&0);
        if *v <= 0 {
        //if count_p <= 0 {
            continue;
        }
        let mut d = f[n.len() - 1];
        for j in 0..10 {
            let mut x = 0;
            if i == j {
                let v = count.get(&i).unwrap_or(&0);
                x = *v - 1;
            } else {
                let v = count.get(&j).unwrap_or(&0);
                x = *v;
            }
            d = d * modpow(f[x as usize], -1, M);
            d %= M
        }
        cnt += d;
        cnt %= M;
    }
    println!("{cnt}");
}
fn modpow(mut a: i128, mut e: i128, m: i128) -> i128 {
    let mut r = 1;
    a %= m;
    while e > 0 {
        if e & 1 == 1 {
            r = (r * a) % m;
        }
        a = (a * a) % m;
        e >>= 1;
    }
    r
}
0