Problem p02609 (python)

Fixed submission:
#%%timeit
N = int(input())
X_str = input()

X = int(X_str, 2)

popcount_cache = [0, 1] + [-1] * 3 * 10 ** 5
for x in range(2, 200000+2):
  popcount_cache[x] =  popcount_cache[x // 2] + x % 2

# def popcount(x):
#   global popcount_cache
#   if popcount_cache[x] < 0:
#     # tmp = x
#     # p = 0
#     # while tmp not in popcount_cache:
#     #   p += tmp % 2
#     #   tmp //= 2
#     popcount_cache[x] = popcount(x // 2) + x % 2
#   return popcount_cache[x]

count_cache = [0, 1] + [-1] * 3 * 10 ** 5
for x in range(2, 200000+2):
  count_cache[x] = 1 + count_cache[x % popcount_cache[x]]


# def count(x):
#   #print('count', x)
#   global count_cache
#   if count_cache[x] < 0:
#     #print('count', x, popcount(x), x % popcount(x))
#     count_cache[x] = 1 + count(x % popcount[x])
#   return count_cache[x]
  
popcount_N = 0
for s in X_str:
  if s == '1':
    popcount_N += 1

def safemod(x, n):
  if n <= 0:
    return 0
  return x % n

Xmodpp = safemod(X, (popcount_N + 1))
Xmodpn = safemod(X, (popcount_N - 1))

ans = []
for i in range(N):
  if i == 0:
    modpp = 1
    modpn = 1
  else:
    modpp = safemod((modpp * 2) , (popcount_N+1))
    modpn = safemod((modpn * 2) , (popcount_N-1))
  if X_str[N - 1 - i] == '0':
    ans.append(count_cache[  safemod((Xmodpp + modpp), (popcount_N + 1))] + 1)
  else:
    if popcount_N == 1:
      ans.append(0)
    else:
      ans.append(count_cache[  safemod((Xmodpn - modpn), (popcount_N - 1))] + 1)

ans.reverse()
for a in ans:
  print(a)

Buggy submission (verdict: Runtime Error):
#%%timeit
N = int(input())
X_str = input()

X = int(X_str, 2)

popcount_cache = [0, 1] + [-1] * 3 * 10 ** 5
for x in range(2, 300000):
  popcount_cache[x] =  popcount_cache[x // 2] + x % 2

# def popcount(x):
#   global popcount_cache
#   if popcount_cache[x] < 0:
#     # tmp = x
#     # p = 0
#     # while tmp not in popcount_cache:
#     #   p += tmp % 2
#     #   tmp //= 2
#     popcount_cache[x] = popcount(x // 2) + x % 2
#   return popcount_cache[x]

count_cache = [0, 1] + [-1] * 3 * 10 ** 5
for x in range(2, 300000):
  count_cache[x] = 1 + count_cache[x % popcount_cache[x]]


# def count(x):
#   #print('count', x)
#   global count_cache
#   if count_cache[x] < 0:
#     #print('count', x, popcount(x), x % popcount(x))
#     count_cache[x] = 1 + count(x % popcount[x])
#   return count_cache[x]
  
popcount_N = 0
for s in X_str:
  if s == '1':
    popcount_N += 1

Xmodpp = X % (popcount_N + 1)
Xmodpn = X % (popcount_N - 1)

ans = []
for i in range(N):
  if i == 0:
    modpp = 1
    modpn = 1
  else:
    modpp = (modpp * 2) % (popcount_N+1)
    modpn = (modpn * 2) % (popcount_N-1)
  if X_str[N - 1 - i] == '0':
    ans.append(count_cache[  (Xmodpp + modpp) % (popcount_N + 1)] + 1)
  else:
    ans.append(count_cache[  (Xmodpn - modpn) % (popcount_N - 1)] + 1)

ans.reverse()
for a in ans:
  print(a)

Buggy submission (verdict: Runtime Error):
#%%timeit
N = int(input())
X_str = input()

X = int(X_str, 2)

popcount_cache = [0, 1] + [-1] * 3 * 10 ** 5
for x in range(2, 200000+2):
  popcount_cache[x] =  popcount_cache[x // 2] + x % 2

# def popcount(x):
#   global popcount_cache
#   if popcount_cache[x] < 0:
#     # tmp = x
#     # p = 0
#     # while tmp not in popcount_cache:
#     #   p += tmp % 2
#     #   tmp //= 2
#     popcount_cache[x] = popcount(x // 2) + x % 2
#   return popcount_cache[x]

count_cache = [0, 1] + [-1] * 3 * 10 ** 5
for x in range(2, 200000+2):
  count_cache[x] = 1 + count_cache[x % popcount_cache[x]]


# def count(x):
#   #print('count', x)
#   global count_cache
#   if count_cache[x] < 0:
#     #print('count', x, popcount(x), x % popcount(x))
#     count_cache[x] = 1 + count(x % popcount[x])
#   return count_cache[x]
  
popcount_N = 0
for s in X_str:
  if s == '1':
    popcount_N += 1

Xmodpp = X % (popcount_N + 1)
Xmodpn = X % (popcount_N - 1)

ans = []
for i in range(N):
  if i == 0:
    modpp = 1
    modpn = 1
  else:
    modpp = (modpp * 2) % (popcount_N+1)
    modpn = (modpn * 2) % (popcount_N-1)
  if X_str[N - 1 - i] == '0':
    ans.append(count_cache[  (Xmodpp + modpp) % (popcount_N + 1)] + 1)
  else:
    ans.append(count_cache[  (Xmodpn - modpn) % (popcount_N - 1)] + 1)

ans.reverse()
for a in ans:
  print(a)