結果
問題 | No.1516 simple 門松列 problem Re:MASTER |
ユーザー | akakimidori |
提出日時 | 2021-05-01 13:00:32 |
言語 | Rust (1.77.0 + proconio) |
結果 |
AC
|
実行時間 | 308 ms / 6,000 ms |
コード長 | 2,489 bytes |
コンパイル時間 | 20,611 ms |
コンパイル使用メモリ | 396,652 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-10-09 04:25:39 |
合計ジャッジ時間 | 16,936 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
5,248 KB |
testcase_01 | AC | 24 ms
5,248 KB |
testcase_02 | AC | 134 ms
5,248 KB |
testcase_03 | AC | 1 ms
5,248 KB |
testcase_04 | AC | 1 ms
5,248 KB |
testcase_05 | AC | 2 ms
5,248 KB |
testcase_06 | AC | 7 ms
5,248 KB |
testcase_07 | AC | 21 ms
5,248 KB |
testcase_08 | AC | 32 ms
5,248 KB |
testcase_09 | AC | 1 ms
5,248 KB |
testcase_10 | AC | 7 ms
5,248 KB |
testcase_11 | AC | 1 ms
5,248 KB |
testcase_12 | AC | 1 ms
5,248 KB |
testcase_13 | AC | 1 ms
5,248 KB |
testcase_14 | AC | 266 ms
5,248 KB |
testcase_15 | AC | 120 ms
5,248 KB |
testcase_16 | AC | 58 ms
5,248 KB |
testcase_17 | AC | 20 ms
5,248 KB |
testcase_18 | AC | 6 ms
5,248 KB |
testcase_19 | AC | 2 ms
5,248 KB |
testcase_20 | AC | 308 ms
5,248 KB |
testcase_21 | AC | 303 ms
5,248 KB |
ソースコード
fn read() -> (usize, usize) { let mut s = String::new(); std::io::stdin().read_line(&mut s).unwrap(); let mut it = s.trim().split_whitespace(); let n = it.next().unwrap().parse::<usize>().unwrap(); let k = it.next().unwrap().parse::<usize>().unwrap(); (n, k) } fn solve(n: usize, k: usize) { let encode = |t: usize, a: usize, b: usize| -> usize { (t * k + a) * k + b }; let decode = |x: usize| -> (usize, usize, usize) { (x / (k * k), x / k % k, x % k) }; let size = 2 * k * k; let mut trans = vec![vec![0usize; size]; size]; for (i, trans) in trans.iter_mut().enumerate() { for (j, trans) in trans.iter_mut().enumerate() { let (a, b, c) = decode(i); let (d, e, f) = decode(j); if c != e || b == c || c == f || b == f || !(c < b.min(f) || c > b.max(f)) { continue; } match (a, d) { (0, 0) => { *trans += 1; }, (0, 1) => { *trans += f; }, (1, 1) => { *trans += 1; }, _ => (), } } } const MOD: usize = 998_244_353; type Mat = Vec<Vec<usize>>; let mul = |a: &Mat, b: &Mat| -> Mat { let mut c = vec![vec![0; a.len()]; a.len()]; for (c, a) in c.iter_mut().zip(a) { for (a, b) in a.iter().zip(b) { for (c, b) in c.iter_mut().zip(b) { *c = (*c + *a * *b) % MOD; } } } c }; let mut t = vec![vec![0; size]; size]; let mut s = trans; for (i, t) in t.iter_mut().enumerate() { t[i] = 1; } let mut m = n - 2; while m > 0 { if m & 1 == 1 { t = mul(&t, &s); } s = mul(&s, &s); m >>= 1; } let mut ini = vec![0; size]; for i in 0..k { for j in 0..k { if i != j { ini[encode(0, i, j)] += 1; ini[encode(1, i, j)] += i + j; } } } let mut ans = [0; 2]; for j in 0..size { let mut s = 0; for (ini, t) in ini.iter().zip(t.iter()) { s = (s + *ini * t[j]) % MOD; } let x = j / k / k; ans[x] = (ans[x] + s) % MOD; } println!("{} {}", ans[0], ans[1]); } fn main() { let (n, k) = read(); solve(n, k); }