結果
| 問題 |
No.262 面白くないビットすごろく
|
| コンテスト | |
| ユーザー |
maspy
|
| 提出日時 | 2020-04-08 20:45:54 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 37 ms / 2,000 ms |
| コード長 | 1,107 bytes |
| コンパイル時間 | 203 ms |
| コンパイル使用メモリ | 12,800 KB |
| 実行使用メモリ | 11,776 KB |
| 最終ジャッジ日時 | 2024-07-19 05:43:11 |
| 合計ジャッジ時間 | 922 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 4 |
ソースコード
#!/usr/bin/ python3.8
import sys
read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
from functools import lru_cache
popcount = [0]
for _ in range(10):
popcount = popcount + [x + 1 for x in popcount]
@lru_cache(None)
def simu(B, n, add):
assert n < (1 << B)
if B < 10:
step = 0
while n < (1 << B):
n += popcount[n] + add
step += 1
return step, n
step, n = simu(B - 1, n, add)
m = n - (1 << (B - 1))
step1, n = simu(B - 1, m, add + 1)
n += 1 << (B - 1)
return step + step1, n
def simu_naive(B, n, add):
step = 0
while n < 1 << B:
n += bin(n).count('1') + add
step += 1
return step, n
N = int(read())
add = 0
total_step = 1
n = 1
for B in range(60, 10, -1):
if N - n < (1 << B):
continue
q, r = divmod(n, 1 << B)
step, next_n = simu(B, r, bin(q).count('1'))
n = (q << B) + next_n
total_step += step
while n < N:
total_step += 1
n += bin(n).count('1')
answer = -1 if n != N else total_step
print(answer)
maspy