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