// -*- coding:utf-8-unix -*- #![allow(dead_code)] #![allow(unused_imports)] use std::cmp; use std::cmp::Ordering; use std::collections::*; use std::convert::*; use std::convert::{From, Into}; use std::fmt::Debug; use std::fs::File; use std::io::prelude::*; use std::io::*; use std::marker::Copy; use std::mem::*; use std::ops::{Add, Mul, Neg, Sub}; use std::str; use std::vec; const INF: i64 = 1223372036854775807; const MEM_SIZE: usize = 202020; const MOD: i64 = 1000000007; // const MOD: i64 = 998244353; use std::cmp::*; use std::collections::*; use std::io::stdin; use std::io::stdout; use std::io::Write; #[allow(dead_code)] fn read() -> T { let mut s = String::new(); std::io::stdin().read_line(&mut s).ok(); s.trim().parse().ok().unwrap() } #[allow(dead_code)] fn readi() -> (i64) { let mut str = String::new(); let _ = stdin().read_line(&mut str).unwrap(); let mut iter = str.split_whitespace(); iter.next().unwrap().parse::().unwrap() } #[allow(dead_code)] fn read_vec() -> Vec { read::() .split_whitespace() .map(|e| e.parse().ok().unwrap()) .collect() } #[allow(dead_code)] fn read_vec2(n: u32) -> Vec> { (0..n).map(|_| read_vec()).collect() } #[allow(dead_code)] fn readii() -> (i64, i64) { let mut str = String::new(); let _ = stdin().read_line(&mut str).unwrap(); let mut iter = str.split_whitespace(); ( iter.next().unwrap().parse::().unwrap(), iter.next().unwrap().parse::().unwrap(), ) } fn readff() -> (f64, f64) { let mut str = String::new(); let _ = stdin().read_line(&mut str).unwrap(); let mut iter = str.split_whitespace(); ( iter.next().unwrap().parse::().unwrap(), iter.next().unwrap().parse::().unwrap(), ) } #[allow(dead_code)] fn readiii() -> (i64, i64, i64) { let mut str = String::new(); let _ = stdin().read_line(&mut str).unwrap(); let mut iter = str.split_whitespace(); ( iter.next().unwrap().parse::().unwrap(), iter.next().unwrap().parse::().unwrap(), iter.next().unwrap().parse::().unwrap(), ) } #[allow(dead_code)] fn readuu() -> (usize, usize) { let mut str = String::new(); let _ = stdin().read_line(&mut str).unwrap(); let mut iter = str.split_whitespace(); ( iter.next().unwrap().parse::().unwrap(), iter.next().unwrap().parse::().unwrap(), ) } fn readcc() -> (char, char) { let mut str = String::new(); let _ = stdin().read_line(&mut str).unwrap(); let mut iter = str.split_whitespace(); ( iter.next().unwrap().parse::().unwrap(), iter.next().unwrap().parse::().unwrap(), ) } #[allow(dead_code)] fn readuuu() -> (usize, usize, usize) { let mut str = String::new(); let _ = stdin().read_line(&mut str).unwrap(); let mut iter = str.split_whitespace(); ( iter.next().unwrap().parse::().unwrap(), iter.next().unwrap().parse::().unwrap(), iter.next().unwrap().parse::().unwrap(), ) } #[allow(dead_code)] fn readuuuu() -> (usize, usize, usize, usize) { let mut str = String::new(); let _ = stdin().read_line(&mut str).unwrap(); let mut iter = str.split_whitespace(); ( iter.next().unwrap().parse::().unwrap(), iter.next().unwrap().parse::().unwrap(), iter.next().unwrap().parse::().unwrap(), iter.next().unwrap().parse::().unwrap(), ) } /// Equivalent to std::lowerbound and std::upperbound in c++ pub trait BinarySearch { fn lower_bound(&self, x: &T) -> usize; fn upper_bound(&self, x: &T) -> usize; } impl BinarySearch for [T] { fn lower_bound(&self, x: &T) -> usize { let mut low = 0; let mut high = self.len(); while low != high { let mid = (low + high) / 2; match self[mid].cmp(x) { Ordering::Less => { low = mid + 1; } Ordering::Equal | Ordering::Greater => { high = mid; } } } low } fn upper_bound(&self, x: &T) -> usize { let mut low = 0; let mut high = self.len(); while low != high { let mid = (low + high) / 2; match self[mid].cmp(x) { Ordering::Less | Ordering::Equal => { low = mid + 1; } Ordering::Greater => { high = mid; } } } low } } #[derive(PartialEq, Eq, Clone, Debug)] enum Inf { Val(T), Inf, } impl Inf { #[allow(dead_code)] fn val(self) -> Option { match self { Inf::Val(v) => Some(v), _ => None, } } } impl PartialOrd for Inf { fn partial_cmp(&self, other: &Self) -> Option { match (self, other) { (&Inf::Inf, &Inf::Inf) => Some(Ordering::Equal), (&Inf::Inf, &Inf::Val(_)) => Some(Ordering::Greater), (&Inf::Val(_), &Inf::Inf) => Some(Ordering::Less), (&Inf::Val(ref a), &Inf::Val(ref b)) => a.partial_cmp(b), } } } impl Ord for Inf { fn cmp(&self, other: &Self) -> Ordering { match (self, other) { (&Inf::Inf, &Inf::Inf) => Ordering::Equal, (&Inf::Inf, &Inf::Val(_)) => Ordering::Greater, (&Inf::Val(_), &Inf::Inf) => Ordering::Less, (&Inf::Val(ref a), &Inf::Val(ref b)) => a.cmp(b), } } } fn solve() { let n: usize = read(); let mut vec = vec![0; 0]; for num in 1..64 { let f = |mid: i64| -> bool { let res = dist(mid as usize, num as usize); return res <= n; }; let mut ok = 0 as i64; let mut ng = INF as i64; while (ng - ok).abs() > 1 { let mid = (ok + ng) / 2; if f(mid) { ok = mid; } else { ng = mid; } } // println!("{:?}", (num, ok)); if (dist(ok as usize, num) == n) { vec.push(ok); } } println!("{:?}", vec.iter().min().unwrap()); } fn dist(x: usize, n: usize) -> usize { let mut sum = 0 as usize; let mut y = x as usize; let mut res = 0 as usize; for i in 0..n { res += y; y /= 2; } return res; } fn main() { solve() }