結果

問題 No.1645 AB's abs
ユーザー uw_yu1rabbituw_yu1rabbit
提出日時 2021-08-14 16:44:18
言語 Rust
(1.83.0 + proconio)
結果
AC  
実行時間 40 ms / 2,000 ms
コード長 3,084 bytes
コンパイル時間 13,485 ms
コンパイル使用メモリ 404,840 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-10-05 12:40:32
合計ジャッジ時間 15,651 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 36
権限があれば一括ダウンロードができます

ソースコード

diff #

#[allow(dead_code)]
fn solve(read: &mut snio::Reader<std::io::StdinLock<'_>>) {
    let n = read.usize();
    let a:Vec<_> = (0..n).map(|_| read.i64() as i128).collect();
    let mut mp = std::collections::HashMap::new();
    *mp.entry(-a[0]).or_insert(0) += 1;
    *mp.entry(a[0]).or_insert(0) += 1;
    const MOD:i128 = 998244353;
    for i in 1..n {
        let mut tmp = std::collections::HashMap::new();
        for (key,val) in &mp {
            *tmp.entry(key + a[i]).or_insert(0) += val;
            *tmp.entry(key - a[i]).or_insert(0) += val;
        }
        mp = tmp;
    }
    let mut rec = std::collections::HashMap::new();
    for (key,val) in mp {
        *rec.entry(key.abs()).or_insert(0) += val;
        *rec.entry(key.abs()).or_insert(0) %= MOD;
    }
    //println!("{:?}",rec);
    let mut ans = 0;
    for (key,val) in rec {
        ans += (key * val) % MOD;
        ans %= MOD;
    }
    println!("{}",ans);
}

//use proconio::input;
fn main() {
    let t = std::io::stdin();
    let mut read = snio::Reader::new(t.lock());
    let n = 1;
    for _ in 0..n {
        solve(&mut read);
    }
}

#[allow(dead_code)]
pub mod snio {
    pub struct Reader<R: std::io::BufRead> {
        reader: R,
        buf: std::collections::VecDeque<String>,
    }

    impl<R: std::io::BufRead> Reader<R> {
        pub fn new(reader: R) -> Self {
            Self {
                reader,
                buf: std::collections::VecDeque::new(),
            }
        }
        fn load(&mut self) {
            while self.buf.is_empty() {
                let mut s = String::new();
                let length = self.reader.read_line(&mut s).unwrap();
                if length == 0 {
                    break;
                }
                self.buf.extend(s.split_whitespace().map(|s| s.to_owned()));
            }
        }
        pub fn string(&mut self) -> String {
            self.load();
            self.buf.pop_front().unwrap_or_else(|| panic!("input ended"))
        }
        pub fn char(&mut self) -> char {
            let string = self.string();
            let mut chars = string.chars();
            let res = chars.next().unwrap();
            assert!(chars.next().is_none(), "invalid input!");
            res
        }
        pub fn chars(&mut self) -> Vec<char> {
            self.read::<String>().chars().collect()
        }
        pub fn read<T: std::str::FromStr>(&mut self) -> T
            where
                <T as ::std::str::FromStr>::Err: ::std::fmt::Debug,
        {
            self.string().parse::<T>().expect("Failed to parse the input.")
        }
    }
    macro_rules! definition_of_reader_of_numbers {
            ($($ty:tt,)*) => {
                impl <R:std::io::BufRead> Reader<R> {
                    $(
                    #[inline]
                    pub fn $ty (&mut self) -> $ty {
                        self.read::<$ty>()
                    }
                    )*
                }
            }
        }
    definition_of_reader_of_numbers! {
        u8,u16,u32,u64,usize,
        i8,i16,i32,i64,isize,
    }
}
0