#![allow(unused_imports)] #![allow(unused_variables)] #![allow(non_snake_case)] use proconio::input; use proconio::marker::*; use std::cmp::*; use std::collections::*; const MOD: i64 = 1_000_000_007; fn main() { input! { A: i64, B: usize, } let (a, b) = solve(A, B); println!("{} {}", a, b); } fn solve(A: i64, B: usize) -> (i64, i64) { const VEC: [i64; 3] = [1, 1, 1]; let mut current = vec![0, 0, 1]; let mut power = B; let mut result = vec![1, 0, 0]; while power > 0 { if power % 2 == 1 { result = mul(&result, ¤t, &VEC); } current = mul(¤t, ¤t, &VEC); power /= 2; } let result = result.iter().map(|&x| (x * A) % MOD).collect::>(); let a = result[1]; let b = result[0]; (a, b) } fn mul(f1: &[i64], f2: &[i64], vec: &[i64]) -> Vec { let mut result = vec![0; 5]; for i in 0..f1.len() { for j in 0..f2.len() { result[i + j] += f1[i] * f2[j]; } } for i in (3..result.len()).rev() { for j in 0..3 { result[i - 3 + j] -= result[i] * vec[j]; } } result.truncate(3); result.iter().map(|&x| ((x % MOD) + MOD) % MOD).collect() }