const MOD: usize = 1e9 as usize + 7; fn power(base: usize, times: usize) -> usize { if times == 0 { return 1usize; } if times == 1 { return base; } let temp = power(base, times/2); temp * temp % MOD * power(base, times%2) % MOD } fn power_mat(target: &Vec>, times: usize) -> Vec> { let n = target.len(); if times == 0 { let mut ret = vec![vec![0usize; n]; n]; for i in 0..n { ret[i][i] = 1; } return ret; } if times == 1 { return target.clone(); } let temp = power_mat(target, times/2); if times % 2 == 1 { calc_mat(&calc_mat(&temp, &temp), target) } else { calc_mat(&temp, &temp) } } fn calc_mat(left: &Vec>, right: &Vec>) -> Vec> { let sizei = left.len(); let sizej = right[0].len(); let sizek = left[0].len(); let mut ret = vec![vec![0usize; sizej]; sizei]; for i in 0..sizei { for j in 0..sizej { ret[i][j] = (0..sizek).map(|k| left[i][k] * right[k][j] % MOD).sum::() % MOD; } } ret } fn solve(mod3val: usize) -> usize { let mut n = String::new(); std::io::stdin().read_line(&mut n).ok(); let n: usize = n.trim().parse().unwrap(); let op = vec![ vec![mod3val,0,0,0,mod3val,mod3val], vec![0,mod3val,0,mod3val,0,mod3val], vec![0,0,mod3val,mod3val,mod3val,0], vec![1,0,0,0,0,0], vec![0,1,0,0,0,0], vec![0,0,1,0,0,0] ]; let op = power_mat(&op, n); op[0][0] } fn main() { let mut t = String::new(); std::io::stdin().read_line(&mut t).ok(); let t: usize = t.trim().parse().unwrap(); let mut result = Vec::with_capacity(t); let mod3val = power(3, MOD-2); for _ in 0..t { result.push(solve(mod3val)); } for &v in result.iter() { println!("{}", v); } }