diff --git a/atcoder/beginner_contests/abc050/src/bin/d.rs b/atcoder/beginner_contests/abc050/src/bin/d.rs index ee80563..313060c 100644 --- a/atcoder/beginner_contests/abc050/src/bin/d.rs +++ b/atcoder/beginner_contests/abc050/src/bin/d.rs @@ -1,3 +1,38 @@ -fn main() { - unimplemented!(); +use std::collections::HashMap; + +use proconio::input; + +const MOD: u128 = 1000000007; + +fn solve(n: u128, memory: &mut HashMap) -> u128 { + if n == 0 { + return 1; + } else if n == 1 { + return 2; + } + + if let Some(res) = memory.get(&n) { + return *res; + } + + if n % 2 == 0 { + let res = (2 * solve(n / 2 - 1, memory) + solve(n / 2, memory)) % MOD; + memory.insert(n, res); + return res; + } else { + let res = (2 * solve(n / 2, memory) + solve(n / 2 - 1, memory)) % MOD; + memory.insert(n, res); + return res; + } +} + +fn main() { + input! { + n: u128, + }; + + let mut memory = HashMap::new(); + let result = solve(n, &mut memory); + + println!("{}", result); }