結果

問題 No.2872 Depth of the Parentheses
ユーザー naut3naut3
提出日時 2024-11-12 20:59:16
言語 Rust
(1.77.0 + proconio)
結果
AC  
実行時間 22 ms / 2,000 ms
コード長 5,447 bytes
コンパイル時間 13,725 ms
コンパイル使用メモリ 406,744 KB
実行使用メモリ 6,820 KB
最終ジャッジ日時 2024-11-12 20:59:32
合計ジャッジ時間 14,020 ms
ジャッジサーバーID
(参考情報)
judge1 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
6,820 KB
testcase_01 AC 1 ms
6,816 KB
testcase_02 AC 1 ms
6,816 KB
testcase_03 AC 1 ms
6,816 KB
testcase_04 AC 1 ms
6,820 KB
testcase_05 AC 1 ms
6,816 KB
testcase_06 AC 1 ms
6,820 KB
testcase_07 AC 22 ms
6,820 KB
testcase_08 AC 1 ms
6,816 KB
testcase_09 AC 1 ms
6,820 KB
testcase_10 AC 6 ms
6,820 KB
testcase_11 AC 3 ms
6,820 KB
testcase_12 AC 2 ms
6,820 KB
testcase_13 AC 3 ms
6,816 KB
testcase_14 AC 2 ms
6,816 KB
testcase_15 AC 1 ms
6,816 KB
testcase_16 AC 21 ms
6,816 KB
testcase_17 AC 1 ms
6,816 KB
testcase_18 AC 20 ms
6,816 KB
testcase_19 AC 1 ms
6,816 KB
testcase_20 AC 21 ms
6,816 KB
testcase_21 AC 1 ms
6,816 KB
testcase_22 AC 20 ms
6,816 KB
evil_01.txt RE -
evil_02.txt RE -
evil_03.txt RE -
evil_04.txt RE -
evil_05.txt RE -
権限があれば一括ダウンロードができます

ソースコード

diff #

#![allow(non_snake_case, unused_must_use, unused_imports)]
use std::io::{self, prelude::*};

fn main() {
    let (stdin, stdout) = (io::read_to_string(io::stdin()).unwrap(), io::stdout());
    let (mut stdin, mut buffer) = (stdin.split_whitespace(), io::BufWriter::new(stdout.lock()));

    macro_rules! input {
        ($t: tt, $n: expr) => {
            (0..$n).map(|_| input!($t)).collect::<Vec<_>>()
        };
        (Chars) => {
            input!(String).chars().collect::<Vec<_>>()
        };
        (Usize1) => {
            stdin.next().unwrap().parse::<usize>().unwrap() - 1
        };
        ($t: ty) => {
            stdin.next().unwrap().parse::<$t>().unwrap()
        };
    }

    type ModInt = modint::ModInt<998244353>;

    let x = input!(u32);
    let K = input!(usize);

    assert!(K <= 10);

    let prob = ModInt::from_raw(1) / ModInt::from_raw(100);
    let p = prob * x;
    let q = prob * (100 - x);
    let mut ans = ModInt::default();

    for s in 0u32..1 << 2 * K {
        'OUTER: {
            let mut stack = vec![];
            let mut cntmax = 0;

            for i in 0..2 * K {
                if (s >> i) & 1 == 1 {
                    // (
                    stack.push(());
                    cntmax = std::cmp::max(cntmax, stack.len());
                } else {
                    // )
                    if stack.len() > 0 {
                        stack.pop();
                    } else {
                        break 'OUTER;
                    }
                }
            }

            if stack.is_empty() {
                let mut prob = ModInt::from_raw(1);

                for i in 0..2 * K {
                    if (s >> i) & 1 == 1 {
                        prob *= p;
                    } else {
                        prob *= q;
                    }
                }

                ans += prob * cntmax;
            }
        }
    }

    writeln!(buffer, "{}", ans);
}

#[rustfmt::skip]
pub mod modint {use std::{fmt::*, ops::*};#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, Default)]pub struct ModInt<const P: u32>(u32);impl<const P: u32> ModInt<P> { pub fn from_raw(value: u32) -> Self { assert!(value < P); Self(value) } pub fn pow(&self, mut x: u32) -> Self { let mut a = *self; let mut r = Self::from_raw(1); while x > 0 { if x & 1 == 1 { r *= a; } a *= a; x >>= 1; } r } pub fn inv(&self) -> Self { self.pow(P - 2) }}impl<const P: u32> Add for ModInt<P> { type Output = Self; fn add(self, rhs: Self) -> Self::Output { Self((self.0 + rhs.0) % P) }}impl<const P: u32> Sub for ModInt<P> { type Output = Self; fn sub(self, rhs: Self) -> Self::Output { Self((P + self.0 - rhs.0) % P) }}impl<const P: u32> Mul for ModInt<P> { type Output = Self; fn mul(self, rhs: Self) -> Self::Output { Self(((self.0 as u64 * rhs.0 as u64) % P as u64) as u32) }}impl<const P: u32> Div for ModInt<P> { type Output = Self; fn div(self, rhs: Self) -> Self::Output { self * rhs.inv() }}impl<const P: u32> AddAssign for ModInt<P> { fn add_assign(&mut self, rhs: Self) { self.0 += rhs.0; self.0 %= P; }}impl<const P: u32> SubAssign for ModInt<P> { fn sub_assign(&mut self, rhs: Self) { self.0 += P - rhs.0; self.0 %= P; }}impl<const P: u32> MulAssign for ModInt<P> { fn mul_assign(&mut self, rhs: Self) { *self = self.clone() * rhs; }}impl<const P: u32> DivAssign for ModInt<P> { fn div_assign(&mut self, rhs: Self) { *self *= rhs.inv() }}impl<const P: u32> Neg for ModInt<P> { type Output = Self; fn neg(self) -> Self::Output { Self((P - self.0) % P) }}impl<const P: u32> Display for ModInt<P> { fn fmt(&self, f: &mut Formatter<'_>) -> Result { write!(f, "{}", self.0) }}macro_rules! impl_op_for_modint { ($($t: ty), *) => { $( impl<const P: u32> From<$t> for ModInt<P> { fn from(value: $t) -> Self { Self((P as $t + value % P as $t) as u32 % P) } } impl<const P: u32> Add<$t> for ModInt<P> { type Output = Self; fn add(self, rhs: $t) -> Self::Output { self + Self::from(rhs) } } impl<const P: u32> Add<ModInt<P>> for $t { type Output = ModInt<P>; fn add(self, rhs: ModInt<P>) -> Self::Output { Self::Output::from(self) + rhs } } impl<const P: u32> Sub<$t> for ModInt<P> { type Output = Self; fn sub(self, rhs: $t) -> Self::Output { self - Self::from(rhs) } } impl<const P: u32> Sub<ModInt<P>> for $t { type Output = ModInt<P>; fn sub(self, rhs: ModInt<P>) -> Self::Output { Self::Output::from(self) - rhs } } impl<const P: u32> Mul<$t> for ModInt<P> { type Output = Self; fn mul(self, rhs: $t) -> Self::Output { self * Self::from(rhs) } } impl<const P: u32> Mul<ModInt<P>> for $t { type Output = ModInt<P>; fn mul(self, rhs: ModInt<P>) -> Self::Output { Self::Output::from(self) * rhs } } impl<const P: u32> Div<$t> for ModInt<P> { type Output = Self; fn div(self, rhs: $t) -> Self::Output { self / Self::from(rhs) } } impl<const P: u32> Div<ModInt<P>> for $t { type Output = ModInt<P>; fn div(self, rhs: ModInt<P>) -> Self::Output { Self::Output::from(self) / rhs } } impl<const P: u32> AddAssign<$t> for ModInt<P> { fn add_assign(&mut self, rhs: $t) { *self += Self::from(rhs) } } impl<const P: u32> SubAssign<$t> for ModInt<P> { fn sub_assign(&mut self, rhs: $t) { *self -= Self::from(rhs) } } impl<const P: u32> MulAssign<$t> for ModInt<P> { fn mul_assign(&mut self, rhs: $t) { *self *= Self::from(rhs) } } impl<const P: u32> DivAssign<$t> for ModInt<P> { fn div_assign(&mut self, rhs: $t) { *self /= Self::from(rhs) } } )* };}impl_op_for_modint!(usize, isize, u64, i64, u32, i32);}
0