Problem p02609 (python)

Fixed submission:
N = int(input())
X = list(input())
X = [int(x) for x in X]
X.reverse()

def popcnt0(n):
    c = 0
    for i in range(64):
        c += (n >> i) & 1
    return c
  
#最初にNまでの表を作る
D = [0 for _ in range(N+1)]
D[1] = 1
for i in range(2, N+1):
  D[i] = D[i % popcnt0(i)] + 1
  
#次に、Xの１のカウントを求める
ct_1 = 0
for x in X:
  if x == 1:
    ct_1 += 1

#ct_1-1による2^n mod
if ct_1 > 1:
  B = [0 for _ in range(N)]
  j = 1
  for i in range(N):
    B[i] = j
    j *= 2
    j %= ct_1 - 1 


#ct_1+1による2^n mod
C = [0 for _ in range(N)]
j = 1
for i in range(N):
  C[i] = j
  j *= 2
  j %= ct_1 + 1 

#X mod ct_1-1 と、X mod ct_1+1 を求める
s = 0
t = 0
for i in range(N):
  if ct_1 > 1:
    s += X[i] * B[i]
    s %= ct_1-1
  t += X[i] * C[i] 
  t %= ct_1+1

X.reverse()
#print(X)
#print(D,B,C)
i = N-1
#各場合の1回目の操作後の数を計算して、Dをつかって答えを出す
for x in X:
  if x == 1:
    if ct_1 > 1:
      k = (s - B[i]) % (ct_1-1)
    else:
      print(0)
  else:
    k = (t + C[i]) % (ct_1+1)        
  i -= 1
  if ct_1 > 1 or x == 0:
    print(D[k]+1)

Buggy submission (verdict: Runtime Error):
N = int(input())
X = list(input())
X = [int(x) for x in X]
X.reverse()

def popcnt0(n):
    c = 0
    for i in range(64):
        c += (n >> i) & 1
    return c
  
#最初にNまでの表を作る
D = [0 for _ in range(N+1)]
D[1] = 1
for i in range(2, N+1):
  D[i] = D[i % popcnt0(i)] + 1
  
#次に、Xの１のカウントを求める
ct_1 = 0
for x in X:
  if x == 1:
    ct_1 += 1

#ct_1-1による2^n mod
B = [0 for _ in range(N)]
j = 1
for i in range(N):
  B[i] = j
  j *= 2
  j %= ct_1 - 1 
  
#ct_1+1による2^n mod
C = [0 for _ in range(N)]
j = 1
for i in range(N):
  C[i] = j
  j *= 2
  j %= ct_1 + 1 

#X mod ct_1-1 と、X mod ct_1+1 を求める
s = 0
t = 0
for i in range(N):
  s += X[i] * B[i]
  t += X[i] * C[i]
  s %= ct_1-1
  t %= ct_1+1

X.reverse()
#print(X)
#print(D,B,C)
i = N-1
#各場合の1回目の操作後の数を計算して、Dをつかって答えを出す
for x in X:
  if x == 1:
    k = (s - B[i]) % (ct_1-1)
  else:
    k = (t + C[i]) % (ct_1+1)
  i -= 1
  print(D[k]+1)

Buggy submission (verdict: Runtime Error):
N = int(input())
X = list(input())
X = [int(x) for x in X]
X.reverse()

def popcnt0(n):
    c = 0
    for i in range(64):
        c += (n >> i) & 1
    return c
  
#最初にNまでの表を作る
D = [0 for _ in range(N+1)]
D[1] = 1
for i in range(2, N+1):
  D[i] = D[i % popcnt0(i)] + 1
  
#次に、Xの１のカウントを求める
ct_1 = 0
for x in X:
  if x == 1:
    ct_1 += 1

#ct_1-1による2^n mod
B = [0 for _ in range(N)]
j = 1
for i in range(N):
  B[i] = j
  j *= 2
  j %= ct_1 - 1 
  
#ct_1+1による2^n mod
C = [0 for _ in range(N)]
j = 1
for i in range(N):
  C[i] = j
  j *= 2
  j %= ct_1 + 1 

#X mod ct_1-1 と、X mod ct_1+1 を求める
s = 0
t = 0
for i in range(N):
  s += X[i] * B[i]
  t += X[i] * C[i]
  s %= ct_1-1
  t %= ct_1+1

X.reverse()
print(X)
#print(D,B,C)
i = N-1
#各場合の1回目の操作後の数を計算して、Dをつかって答えを出す
for x in X:
  if x == 1:
    k = (s - B[i]) % (ct_1-1)
  else:
    k = (t + C[i]) % (ct_1+1)
  i -= 1
  print(D[k]+1)

Buggy submission (verdict: Runtime Error):
N = int(input())
X = list(input())
X = [int(x) for x in X]
X.reverse()

def popcnt0(n):
    c = 0
    for i in range(32):
        c += (n >> i) & 1
    return c
  
#最初にNまでの表を作る
D = [0 for _ in range(N+1)]
D[1] = 1
for i in range(2, N+1):
  D[i] = D[i % popcnt0(i)] + 1
  
#次に、Xの１のカウントを求める
ct_1 = 0
for x in X:
  if x == 1:
    ct_1 += 1

#ct_1-1による2^n mod
B = [0 for _ in range(N)]
j = 1
for i in range(N):
  B[i] = j
  j *= 2
  j %= ct_1 - 1 
  
#ct_1+1による2^n mod
C = [0 for _ in range(N)]
j = 1
for i in range(N):
  C[i] = j
  j *= 2
  j %= ct_1 + 1 

#X mod ct_1-1 と、X mod ct_1+1 を求める
s = 0
t = 0
for i in range(N):
  s += X[i] * B[i]
  t += X[i] * C[i]
  s %= ct_1-1
  t %= ct_1+1

X.reverse()
#print(D,B,C)
i = N-1
#各場合の1回目の操作後の数を計算して、Dをつかって答えを出す
for x in X:
  if x == 1:
    k = (s - B[i]) % (ct_1-1)
  else:
    k = (t + C[i]) % (ct_1+1)
  i -= 1
  print(D[k]+1)