const DIVISOR: usize = 1_000_000_007; fn multi(a: &Vec>, b: &Vec>) -> Vec> { vec![ vec![ (a[0][0] * b[0][0] + a[0][1] * b[1][0]) % DIVISOR , (a[0][0] * b[0][1] + a[0][1] * b[1][1]) % DIVISOR ] , vec![ (a[1][0] * b[0][0] + a[1][1] * b[1][0]) % DIVISOR , (a[1][0] * b[0][1] + a[1][1] * b[1][1]) % DIVISOR ] ] } fn multi_n(n: usize) -> Vec> { let base: Vec> = vec![vec![1, 1], vec![1, 0]]; if n == 1 { return base; } let val = multi_n(n / 2); let mut ret = multi(&val, &val); if n % 2 == 1 { ret = multi(&ret, &base); } ret } //TODO fn main() { let mut n = String::new(); std::io::stdin().read_line(&mut n).ok(); let n: usize = n.trim().parse().unwrap(); let result = multi_n(n); let fn_1 = result[0][0]; let fn_0 = result[1][0]; println!("{}", fn_1 * fn_0 % DIVISOR); }