結果
問題 |
No.3045 反復重み付き累積和
|
ユーザー |
![]() |
提出日時 | 2025-03-06 03:01:39 |
言語 | Rust (1.83.0 + proconio) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,141 bytes |
コンパイル時間 | 13,516 ms |
コンパイル使用メモリ | 394,876 KB |
実行使用メモリ | 41,888 KB |
最終ジャッジ日時 | 2025-03-06 03:02:02 |
合計ジャッジ時間 | 20,716 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 4 TLE * 1 -- * 36 |
コンパイルメッセージ
warning: unused variable: `i` --> src/main.rs:58:13 | 58 | for i in 1..=n { | ^ help: if this is intentional, prefix it with an underscore: `_i` | = note: `#[warn(unused_variables)]` on by default
ソースコード
use std::io; const MOD: i64 = 998244353; fn mod_pow(base: i64, exp: i64, modulus: i64) -> i64 { let mut result = 1; let mut base = base % modulus; let mut exp = exp; while exp > 0 { if exp % 2 == 1 { result = result * base % modulus; } base = base * base % modulus; exp /= 2; } result } fn prod(a: &Vec<Vec<i64>>, b: &Vec<Vec<i64>>, k: usize, l: usize, m: usize) -> Vec<Vec<i64>> { let mut c = vec![vec![0; m]; k]; for i in 0..k { for j in 0..m { let mut ans = 0; for pl in 0..l { ans = (ans + a[i][pl] * b[pl][j]) % MOD; } c[i][j] = ans; } } c } fn main() { let mut input = String::new(); io::stdin().read_line(&mut input).unwrap(); let nums: Vec<usize> = input.trim().split_whitespace().map(|x| x.parse().unwrap()).collect(); let (n, q) = (nums[0], nums[1]); input.clear(); io::stdin().read_line(&mut input).unwrap(); let mut a: Vec<Vec<i64>> = vec![input.trim().split_whitespace().map(|x| x.parse().unwrap()).collect()]; for _ in 0..q { input.clear(); io::stdin().read_line(&mut input).unwrap(); let l: Vec<i64> = input.trim().split_whitespace().map(|x| x.parse().unwrap()).collect(); if l[0] == 2 { let x = (l[1] - 1) as usize; println!("{}", a[0][x]); continue; } let (k, x) = (l[1], l[2]); let mut l_vec = vec![1i64]; let (mut bunshi, mut bunbo) = (x, 1); for i in 1..=n { let now = *l_vec.last().unwrap(); l_vec.push(now * k * bunshi % MOD * mod_pow(bunbo, MOD - 2, MOD) % MOD); bunshi += 1; bunbo += 1; } let mut x_mat = vec![vec![0; n]; n]; for i in 0..n { for j in 0..n { if i + j < n { x_mat[i][i + j] = l_vec[j]; } else { break; } } } a = prod(&a, &x_mat, 1, n, n); } }