# 10**18 < 2**60であり跳ね返り回数は60回以下と言える # x, と跳ね返り回数k # 跳ね返り回数kを固定とすれば飛距離はxの単調増加となる # それでkごとにxを二分探索で求めるか D = int(input()) def distance(x, k): d = 0 x_ = x for k_ in range(k): d += x_ x_ //= 2 return d x_candidates = [] for k in range(1, 61): NG = 0 OK = D+1 while OK-NG>1: mid = (OK+NG)//2 if distance(mid, k)>=D: OK = mid else: NG = mid #print('k', k, 'OK', OK) # ここが怪しいよな、OK値でダメなら、OK+1などを調べる必要ないのか if distance(OK, k) == D: x_candidates.append(OK) #print(x_candidates) ans = min(x_candidates) print(ans)