use std::io::*; use std::str::FromStr; fn main() { exec(read()); } fn exec(i: i64) { if i >= 50 { println!("000000000000"); } else if i >= 15 { let rem = get_fact(i); println!("{:>012}", rem); } else { let rem = get_fact(i); println!("{}", rem); } } fn get_fact(i: i64) -> i64 { const MOD: i64 = 1_000_000_000_000; let fact_i = recurse(i, &|n, fact| { if n <= 1 { 1_i64 } else { n * fact(n - 1) % MOD } }); fact_i } fn recurse(x: X, f: &dyn Fn(X, &dyn Fn(X) -> Y) -> Y) -> Y { f(x, &|x: X| recurse(x, &f)) } fn read() -> T { let stdin = stdin(); let stdin = stdin.lock(); let token: String = stdin .bytes() .map(|c| c.expect("failed to read char") as char) .skip_while(|c| c.is_whitespace()) .take_while(|c| !c.is_whitespace()) .collect(); token.parse().ok().expect("failed to parse token") }