結果
問題 | No.1958 Bit Game |
ユーザー |
|
提出日時 | 2022-09-15 01:01:12 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 94 ms / 2,000 ms |
コード長 | 2,276 bytes |
コンパイル時間 | 11,528 ms |
コンパイル使用メモリ | 399,008 KB |
実行使用メモリ | 11,136 KB |
最終ジャッジ日時 | 2024-12-15 13:58:17 |
合計ジャッジ時間 | 16,634 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 30 |
コンパイルメッセージ
warning: function `power` is never used --> src/main.rs:4:4 | 4 | fn power(times: usize, target: &Vec<Vec<usize>>) -> Vec<Vec<usize>> { | ^^^^^ | = note: `#[warn(dead_code)]` on by default warning: function `calc` is never used --> src/main.rs:19:4 | 19 | fn calc(left: &Vec<Vec<usize>>, right: &Vec<Vec<usize>>) -> Vec<Vec<usize>> { | ^^^^ warning: variable `SIZE` should have a snake case name --> src/main.rs:46:9 | 46 | let SIZE = 18; | ^^^^ help: convert the identifier to snake case: `size` | = note: `#[warn(non_snake_case)]` on by default
ソースコード
const MOD: usize = 998244353;fn power(times: usize, target: &Vec<Vec<usize>>) -> Vec<Vec<usize>> {let n = target.len();if times == 0 {let mut ret = vec![vec![0usize; n]; n];for i in 0..n { ret[i][i] = 1; }return ret;}let base = power(times/2, target);if times % 2 == 1 {calc(&calc(&base, &base), target)} else {calc(&base, &base)}}fn calc(left: &Vec<Vec<usize>>, right: &Vec<Vec<usize>>) -> Vec<Vec<usize>> {let sizei = left.len();let sizej = right[0].len();let sizek = left[0].len();let mut ret = vec![vec![0usize; sizej]; sizei];for i in 0..sizei {for j in 0..sizej {ret[i][j] = (0..sizek).map(|k| left[i][k] * right[k][j] % MOD).sum::<usize>() % MOD;}}ret}fn main() {let mut nxy = String::new();std::io::stdin().read_line(&mut nxy).ok();let nxy: Vec<usize> = nxy.trim().split_whitespace().map(|s| s.parse().unwrap()).collect();let n = nxy[0];let x = nxy[1];let y = nxy[2];let mut a = String::new();std::io::stdin().read_line(&mut a).ok();let a: Vec<usize> = a.trim().split_whitespace().map(|s| s.parse().unwrap()).collect();let mut b = String::new();std::io::stdin().read_line(&mut b).ok();let b: Vec<usize> = b.trim().split_whitespace().map(|s| s.parse().unwrap()).collect();let SIZE = 18;let mut pct = vec![0usize; SIZE];let mut tute = vec![0usize; SIZE];for &v in a.iter() {for i in 0..SIZE {if ((v >> i) & 1) == 1 {pct[i] += 1;}}}for &v in b.iter() {for i in 0..SIZE {if ((v >> i) & 1) == 1 {tute[i] += 1;}}}let mut patterns = vec![1usize; n+1];for i in 0..n { patterns[i+1] = patterns[i] * x % MOD * y % MOD; }let mut op = vec![0usize; SIZE];for pat in 0..n {for i in 0..SIZE {op[i] = op[i] * pct[i] % MOD + (MOD + patterns[pat] - op[i]) * pct[i] % MOD + (x - pct[i]) * op[i] % MOD;op[i] %= MOD;op[i] = op[i] * tute[i] % MOD;}}println!("{}", (0..SIZE).map(|i| op[i] * (1 << i) % MOD).sum::<usize>() % MOD);}