結果
問題 | No.3044 よくあるカエルさん |
ユーザー |
|
提出日時 | 2025-03-20 17:14:15 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 69 ms / 2,000 ms |
コード長 | 2,399 bytes |
コンパイル時間 | 12,187 ms |
コンパイル使用メモリ | 389,512 KB |
実行使用メモリ | 7,324 KB |
最終ジャッジ日時 | 2025-03-20 17:14:30 |
合計ジャッジ時間 | 13,778 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 20 |
ソースコード
#![allow(dead_code, unused_imports, unused_macros, non_snake_case)] use proconio::{ input, input_interactive, marker::{Bytes, Chars, Usize1}, }; fn main() { input! { n: i64, t : usize, k: i64, l : i64, } const MOD: i64 = 998244353; let inv6 = modinv(6, MOD); let mut mat = vec![vec![0; t]; t]; for i in 1..t { mat[i][i - 1] = 1; } mat[0][0] = (k - 1) * inv6 % MOD; mat[0][1] = (l - k) * inv6 % MOD; mat[0][t - 1] = (7 - l) * inv6 % MOD; let res = mat_pow(&mat, n - 1, MOD); println!("{}", res[0][0]); } pub fn modpow(mut x: i64, mut y: i64, modulo: i64) -> i64 { x %= modulo; if x == 0 { return 0; } let mut ret = 1; let mut cur = x; while y > 0 { if y & 1 > 0 { ret = ret * cur % modulo; } cur = cur * cur % modulo; y >>= 1; } ret } pub fn modinv(mut x: i64, modulo: i64) -> i64 { x = x.rem_euclid(modulo); extgcd(x, modulo).0.rem_euclid(modulo) } // return (x, y, gcd(a, b)) s.t. a * x + b * y = gcd(a, b) pub fn extgcd(a: i64, b: i64) -> (i64, i64, i64) { let mut x1 = 1; let mut y1 = 0; let mut m = a; let mut x2 = 0; let mut y2 = 1; let mut n = b; while m % n != 0 { let q = m / n; x1 -= q * x2; y1 -= q * y2; m -= q * n; std::mem::swap(&mut x1, &mut x2); std::mem::swap(&mut y1, &mut y2); std::mem::swap(&mut m, &mut n); } (x2, y2, n) } pub fn mat_mult(a: &[Vec<i64>], b: &[Vec<i64>], modulo: i64) -> Vec<Vec<i64>> { let n = a.len(); let m = a[0].len(); assert_eq!(b.len(), m); let o = b[0].len(); let mut res = vec![vec![0; o]; n]; for i in 0..n { for (j, bj) in b.iter().enumerate() { for (k, bjk) in bj.iter().enumerate() { res[i][k] = (res[i][k] + a[i][j] * bjk) % modulo; } } } res } pub fn mat_pow(a: &[Vec<i64>], mut k: i64, modulo: i64) -> Vec<Vec<i64>> { let n = a.len(); assert_eq!(a[0].len(), n); let mut res = vec![vec![0; n]; n]; for (i, resi) in res.iter_mut().enumerate() { resi[i] = 1; } let mut v = a.to_owned(); while k > 0 { if k & 1 == 1 { res = mat_mult(&v, &res, modulo); } v = mat_mult(&v, &v, modulo); k >>= 1; } res }