use std::collections::VecDeque; fn main() { let mut n = String::new(); std::io::stdin().read_line(&mut n).ok(); let n: usize = n.trim().parse().unwrap(); let mut dp = vec![3; n+1]; dp[n] = 0; let mut deque = VecDeque::new(); for i in 1.. { let val = i * (i+1) / 2; if val > n { break; } dp[n - val] = 1; deque.push_back(n - val); } while let Some(v) = deque.pop_front() { for i in 1.. { let val = i * (i + 1) / 2; if val > v { break; } dp[v - val] = dp[v - val].min(2); } } println!("{}", dp[0]); }