#![allow(clippy::needless_range_loop)] use proconio::{fastout, input, marker::Usize1}; use std::array; const M: usize = 17; #[fastout] fn main() { input! { n: [Usize1] } let mat = [[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], [1, 1, 1, 1]]; let mut doubling = vec![mat; 64]; for i in 1..64 { doubling[i] = mat_mul(&doubling[i - 1], &doubling[i - 1]); } for ni in n { let mut vec = [0, 0, 0, 1]; for i in 0..64 - ni.leading_zeros() as usize { if ni >> i & 1 == 1 { vec = mat_vec_mul(&doubling[i], &vec); } } println!("{}", vec[0]); } } fn mat_mul(l: &[[usize; 4]; 4], r: &[[usize; 4]; 4]) -> [[usize; 4]; 4] { array::from_fn(|i| array::from_fn(|j| (0..4).map(|k| l[i][k] * r[k][j] % M).sum::() % M)) } fn mat_vec_mul(m: &[[usize; 4]; 4], x: &[usize; 4]) -> [usize; 4] { array::from_fn(|i| (0..4).map(|j| m[i][j] * x[j] % M).sum::() % M) }