use std::io::{stdin, Read}; use std::str::FromStr; const _mod: usize = 1000000007; fn main() { let n: usize = read(); let mut inv = vec![0; 2 * n + 10]; let mut f = vec![0; 2 * n + 10]; f[0] = 1; inv[0] = 1; for i in 0..n + 10 { f[i + 1] = (f[i] * (i + 1)) % _mod; inv[i + 1] = (inv[i] * (powm((i + 1), _mod - 2))) % _mod; } let mut ans = 0; for i in 1..n + 1 { let mut tmp = powm(i, n - i); tmp *= (inv[i] * inv[n - i]) % _mod * f[n] % _mod; ans += tmp; ans %= _mod; } println!("{}", ans); } fn add(a: &mut usize, b: usize) { *a = (*a + b + _mod) % _mod; } fn powm(a: usize, p: usize) -> usize { let mut ans = 1; let mut a = a.clone(); let mut p = p.clone(); while p > 0 { if p % 2 == 1 { ans *= a; } a = (a * a) % _mod; ans %= _mod; p /= 2; } ans } #[allow(dead_code)] fn read_str() -> Vec { let s: String = read(); s.chars().collect::>() } #[allow(dead_code)] fn read() -> T { let stdin = stdin(); let stdin = stdin.lock(); let s = stdin .bytes() .map(|c| c.unwrap() as char) .skip_while(|c| c.is_whitespace()) .take_while(|c| !c.is_whitespace()) .collect::(); s.parse::().unwrap_or_else( |_| panic!("Faild to parse {}", s), ) }