結果
問題 | No.1513 simple 門松列 problem |
ユーザー | akakimidori |
提出日時 | 2021-05-01 12:32:43 |
言語 | Rust (1.77.0 + proconio) |
結果 |
AC
|
実行時間 | 144 ms / 3,000 ms |
コード長 | 2,367 bytes |
コンパイル時間 | 17,883 ms |
コンパイル使用メモリ | 401,168 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-10-09 04:31:00 |
合計ジャッジ時間 | 19,598 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
5,248 KB |
testcase_01 | AC | 1 ms
5,248 KB |
testcase_02 | AC | 141 ms
5,248 KB |
testcase_03 | AC | 2 ms
5,248 KB |
testcase_04 | AC | 1 ms
5,248 KB |
testcase_05 | AC | 1 ms
5,248 KB |
testcase_06 | AC | 1 ms
5,248 KB |
testcase_07 | AC | 1 ms
5,248 KB |
testcase_08 | AC | 1 ms
5,248 KB |
testcase_09 | AC | 1 ms
5,248 KB |
testcase_10 | AC | 1 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 | 144 ms
5,248 KB |
testcase_15 | AC | 143 ms
5,248 KB |
testcase_16 | AC | 140 ms
5,248 KB |
testcase_17 | AC | 88 ms
5,248 KB |
testcase_18 | AC | 31 ms
5,248 KB |
testcase_19 | AC | 3 ms
5,248 KB |
testcase_20 | AC | 19 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) { const MOD: usize = 998_244_353; // dp[i][j] = (way, sum): 直前2項がi, j であるような方法の数、数列の和 let mut dp = vec![vec![(0, 0); k]; k]; for (i, dp) in dp.iter_mut().enumerate() { for (j, dp) in dp.iter_mut().enumerate() { if i != j { *dp = (1, i + j); } } } for _ in 2..n { let mut next = vec![vec![(0, 0); k + 1]; k]; for (i, dp) in dp.iter().enumerate() { for (j, &(way, sum)) in dp.iter().enumerate() { if i == j { continue; } if j < i { next[j][j + 1].0 += way; next[j][j + 1].1 += sum; next[j][i].0 += MOD - way; next[j][i].1 += MOD - sum; next[j][i + 1].0 += way; next[j][i + 1].1 += sum; } else { next[j][0].0 += way; next[j][0].1 += sum; next[j][i].0 += MOD - way; next[j][i].1 += MOD - sum; next[j][i + 1].0 += way; next[j][i + 1].1 += sum; next[j][j].0 += MOD - way; next[j][j].1 += MOD - sum; } } } next.iter_mut().flatten().for_each(|p| { p.0 %= MOD; p.1 %= MOD; }); for next in next.iter_mut() { for i in 1..=k { next[i].0 = (next[i - 1].0 + next[i].0) % MOD; next[i].1 = (next[i - 1].1 + next[i].1) % MOD; } next.pop(); for (i, po) in next.iter_mut().enumerate() { po.1 = (po.1 + i * po.0) % MOD; } } dp = next; } let (w, s) = dp .iter() .flatten() .fold((0, 0), |s, a| ((s.0 + a.0) % MOD, (s.1 + a.1) % MOD)); println!("{} {}", w, s); } fn main() { let (n, k) = read(); solve(n, k); }