結果
問題 |
No.2711 Connecting Lights
|
ユーザー |
|
提出日時 | 2024-03-31 14:51:29 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 151 ms / 5,000 ms |
コード長 | 5,385 bytes |
コンパイル時間 | 12,974 ms |
コンパイル使用メモリ | 387,572 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2024-09-30 20:02:14 |
合計ジャッジ時間 | 14,784 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 27 |
ソースコード
#![allow(unused_imports)] //use itertools::{iproduct, Itertools}; //use proconio::input; //use proconio::marker::*; use std::collections::*; fn main() { input! { n:usize, m:usize, k:usize, } let mut dp = vec![ModInt::<MOD>::new(1); 1 << n]; for _ in 0..m - 1 { let mut ndp = vec![ModInt::<MOD>::new(0); 1 << n]; for s in 0..1 << n { for t in 0..1 << n { let mut cnt = 0; for j in 0..n { if s & (1 << j) != 0 && t & (1 << j) != 0 { cnt += 1; } } if k <= cnt { ndp[t] = ndp[t] + dp[s]; } } } dp = ndp; } let mut ans = ModInt::new(0); for i in 0..1 << n { ans += dp[i]; } println!("{}", ans); } const MOD: usize = 998244353; use modint::*; mod modint { use std::fmt; use std::ops; #[derive(Copy, Clone, PartialEq, Eq)] pub struct ModInt<const MOD: usize> { pub val: usize, } impl<const MOD: usize> ModInt<MOD> { pub fn new(val: usize) -> Self { Self { val: val % MOD } } pub fn pow(mut self, mut e: usize) -> Self { let mut res = Self::new(1); while 0 < e { if e & 1 != 0 { res *= self; } self *= self; e >>= 1; } res } } impl<const MOD: usize> From<usize> for ModInt<MOD> { fn from(value: usize) -> Self { Self { val: value % MOD } } } impl<const MOD: usize> fmt::Display for ModInt<MOD> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.val) } } impl<const MOD: usize> fmt::Debug for ModInt<MOD> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.val) } } impl<const MOD: usize> ops::Neg for ModInt<MOD> { type Output = Self; fn neg(self) -> Self::Output { Self { val: (MOD - self.val) % MOD, } } } impl<const MOD: usize> ops::Add for ModInt<MOD> { type Output = Self; fn add(self, rhs: Self) -> Self::Output { Self { val: (self.val + rhs.val) % MOD, } } } impl<const MOD: usize> ops::AddAssign for ModInt<MOD> { fn add_assign(&mut self, rhs: Self) { *self = *self + rhs; } } impl<const MOD: usize> ops::Mul for ModInt<MOD> { type Output = Self; fn mul(self, rhs: Self) -> Self::Output { Self { val: self.val * rhs.val % MOD, } } } impl<const MOD: usize> ops::MulAssign for ModInt<MOD> { fn mul_assign(&mut self, rhs: Self) { *self = *self * rhs; } } impl<const MOD: usize> ops::Sub for ModInt<MOD> { type Output = Self; fn sub(mut self, rhs: Self) -> Self::Output { if self.val < rhs.val { self.val += MOD; } Self { val: (self.val - rhs.val) % MOD, } } } impl<const MOD: usize> ops::SubAssign for ModInt<MOD> { fn sub_assign(&mut self, rhs: Self) { if self.val < rhs.val { self.val += MOD; } *self = *self - rhs; } } impl<const MOD: usize> ops::Div for ModInt<MOD> { type Output = Self; fn div(self, rhs: Self) -> Self { assert!(rhs.val != 0); self * rhs.pow(MOD - 2) } } impl<const MOD: usize> ops::DivAssign for ModInt<MOD> { fn div_assign(&mut self, rhs: Self) { *self = *self / rhs } } } use input::*; mod input { #[macro_export] 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)*} }; } #[macro_export] 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)*} }; } #[macro_export] 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, 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") }; } }