Submission #20936652


Source Code Expand

// https://atcoder.jp/contests/arc114/tasks/arc114_c
//
#![allow(unused_imports)]
use std::io::*;
use std::io::Write;
use std::fmt::*;
use std::str::*;
use std::cmp::*;
use std::collections::*;

// Input macros.
// Original by tanakh: https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8
#[allow(unused_macros)]
macro_rules! input {
    (source = $s:expr, $($r:tt)*) => {
        let mut iter = $s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
    ($($r:tt)*) => {
        let s = {
            use std::io::Read;
            let mut s = String::new();
            std::io::stdin().read_to_string(&mut s).unwrap();
            s
        };
        let mut iter = s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
}

#[allow(unused_macros)]
macro_rules! input_inner {
    ($iter:expr) => {};
    ($iter:expr, ) => {};

    ($iter:expr, $var:ident : $t:tt $($r:tt)*) => {
        let $var = read_value!($iter, $t);
        input_inner!{$iter $($r)*}
    };

    ($iter:expr, mut $var:ident : $t:tt $($r:tt)*) => {
        let mut $var = read_value!($iter, $t);
        input_inner!{$iter $($r)*}
    };
}

#[allow(unused_macros)]
macro_rules! read_value {
    ($iter:expr, ( $($t:tt),* )) => {
        ( $(read_value!($iter, $t)),* )
    };

    ($iter:expr, [ $t:tt ; $len:expr ]) => {
        (0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>()
    };

    ($iter:expr, [ next / $t:tt ]) => {
        {
            let len = read_value!($iter, usize);
            (0..len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>()
        }
    };

    ($iter:expr, switch) => {
        {
            let ty = read_value!($iter, i32);
            if ty == 1 {
                vec![ty, read_value!($iter, i32), read_value!($iter, i32)]
            } else if ty == 2 {
                vec![ty, read_value!($iter, i32)]
            } else {
                vec![ty, read_value!($iter, i32)]
            }
        }
    };

    ($iter:expr, chars) => {
        read_value!($iter, String).chars().collect::<Vec<char>>()
    };

    ($iter:expr, usize1) => {
        read_value!($iter, usize) - 1
    };

    ($iter:expr, $t:ty) => {
        $iter.next().unwrap().parse::<$t>().expect("Parse error")
    };
}

#[allow(unused_macros)]
macro_rules! read_line {
    ($t:tt) => {
        {
            let mut s = String::new();
            std::io::stdin().read_line(&mut s).unwrap();
            s.trim_right().parse::<$t>().unwrap()
        }
    }
}

#[allow(unused_macros)]
macro_rules! dvec {
    ($t:expr ; $len:expr) => {
        vec![$t; $len]
    };

    ($t:expr ; $len:expr, $($rest:expr),*) => {
        vec![dvec!($t; $($rest),*); $len]
    };
}

#[allow(unused_macros)]
macro_rules! ifv {
    ($t:expr, $a:expr, $b: expr) => {
        if $t { $a } else { $b }
    }
}

#[allow(unused_macros)]
macro_rules! fill {
    ($t:expr, $v:expr) => {
        for i in 0..$t.len() {
            $t[i] = $v;
        }
    };
}

#[allow(unused_macros)]
macro_rules! join {
    ($t:expr, $glue:expr) => {
        $t.into_iter().map(|w| w.to_string()).collect::<Vec<_>>().join($glue)
    };
}

#[allow(unused_macros)]
macro_rules! debug {
    ($($a:expr),*) => {
        eprintln!(concat!($(stringify!($a), " = {:?}, "),*), $($a),*);
    }
}

// ===


const MOD: i64 = 998244353;
fn main() {
    input! {
        n: usize, m: usize
    };
    if n == 1 {
        println!("{}", m);
        return;
    }

    let mut mp = dvec![0; m+1, n+1];
    for k in 0..=m {
        mp[k][0] = 1;
        for i in 1..=n {
            mp[k][i] = (mp[k][i-1] * (k as i64)) % MOD;
        }
    }

    let mut ans = mp[m][n]; // l=n
    for l in 1..=n-1 {
        let edge = 2;
        let center = (n-l-1) as i64;
        for k in 2..=m {
            // edge
            let wptn = (mp[m-k+1][l] + MOD - mp[m-k][l]) % MOD;
            let eptn = (k-1) as i64;
            let anyptn = mp[m][n-l-1];

            ans += wptn * eptn % MOD * anyptn % MOD * 2 % MOD;
            ans %= MOD;

            if l < n-1 {
                let eptn = ((k-1)*(k-1)) as i64 % MOD;
                let anyptn = mp[m][n-l-2];

                ans += wptn * eptn % MOD * anyptn % MOD * center % MOD;
                ans %= MOD;
            }
        }
    }
    println!("{}", ans);
}

Submission Info

Submission Time
Task C - Sequence Scores
User hamadu
Language Rust (1.42.0)
Score 600
Code Size 4464 Byte
Status AC
Exec Time 1591 ms
Memory 197672 KiB

Compile Error

warning: unused variable: `edge`
   --> src/main.rs:165:13
    |
165 |         let edge = 2;
    |             ^^^^ help: consider prefixing with an underscore: `_edge`
    |
    = note: `#[warn(unused_variables)]` on by default

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 3
AC × 22
Set Name Test Cases
Sample s1.txt, s2.txt, s3.txt
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, s1.txt, s2.txt, s3.txt
Case Name Status Exec Time Memory
01.txt AC 13 ms 2692 KiB
02.txt AC 4 ms 2388 KiB
03.txt AC 76 ms 15720 KiB
04.txt AC 193 ms 35244 KiB
05.txt AC 4 ms 2492 KiB
06.txt AC 208 ms 36324 KiB
07.txt AC 350 ms 62376 KiB
08.txt AC 421 ms 75816 KiB
09.txt AC 81 ms 16824 KiB
10.txt AC 259 ms 47032 KiB
11.txt AC 401 ms 71772 KiB
12.txt AC 639 ms 112808 KiB
13.txt AC 205 ms 42244 KiB
14.txt AC 464 ms 82476 KiB
15.txt AC 555 ms 96524 KiB
16.txt AC 830 ms 138564 KiB
17.txt AC 1 ms 2052 KiB
18.txt AC 1180 ms 197672 KiB
19.txt AC 1591 ms 196820 KiB
s1.txt AC 1 ms 2044 KiB
s2.txt AC 1 ms 2060 KiB
s3.txt AC 4 ms 1912 KiB