use proconio::input; use std::collections::HashMap; fn gcd(x: usize, y: usize) -> usize { if x < y { return gcd(y, x); } if y == 0 { return y; } gcd(y, x % y) } fn main() { input! { N: usize, } let mut dp = HashMap::new(); fn rec(dp: &mut HashMap, n: usize) -> f64 { if n == 0 { return 0.0; } if let Some(&ans) = dp.get(&n) { return ans; } let mut sum = 0.0; for i in 1 ..= n { sum += 1.0 + rec(dp, gcd(n, i)); } let ans = sum / n as f64; dp.insert(n, ans); ans } println!("{}", rec(&mut dp, N)); }