結果
| 問題 | 
                            No.1286 Stone Skipping
                             | 
                    
| コンテスト | |
| ユーザー | 
                             FromBooska
                         | 
                    
| 提出日時 | 2023-08-30 18:02:01 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 50 ms / 2,000 ms | 
| コード長 | 811 bytes | 
| コンパイル時間 | 402 ms | 
| コンパイル使用メモリ | 82,608 KB | 
| 実行使用メモリ | 64,828 KB | 
| 最終ジャッジ日時 | 2025-01-02 11:52:49 | 
| 合計ジャッジ時間 | 3,004 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 26 | 
ソースコード
# 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)
            
            
            
        
            
FromBooska