def solve(N):
from math import sqrt, floor
ret = [0] * (N + 1)
n = N
for x in range(1, floor(sqrt(n))):
v0 = x * x
for y in range(1, floor(sqrt(n))):
v1 = v0 + y * y + y * x
if v1 >= n:
break
for z in range(1, floor(sqrt(n))):
v = v1 + z * z + y * z + z * x
if v > n:
break
ret[v] += 1
return ret[1:]
def solve(N, X):
o1 = ord("1")
def f(n):
p = bin(n).count("1")
return n % p
table = [0] * 20
for i in range(1, 20):
x = f(i)
if x == 0:
table[i] = 1
else:
table[i] = table[x] + 1
numOne = X.count(o1)
ret = [0] * N
v = 0
mod = numOne + 1
p2mod_p1 = [0] * N
p = 1
for j in range(N):
v *= 2
v %= mod
if (X[j] == o1):
v += 1
p2mod_p1[j] = p
p *= 2
p %= mod
xmod_p1 = v % mod # X mod (bc(X) + 1)
xmod_m1 = 0 # X mod (bc(X) - 1)
if numOne > 1:
p = 1
p2mod_m1 = [0] * N
v = 0
mod = numOne - 1
for j in range(N):
v *= 2
v %= mod
if (X[j] == o1):
v += 1
xmod_m1 = v % mod
p2mod_m1[j] = p
p *= 2
p %= mod
for i in range(N):
if X[i] == o1:
mod = numOne - 1
if mod == 0:
# already 0
ret[i] = 0
continue
v2 = (xmod_m1 - p2mod_m1[-1-i]) % mod
else:
mod = numOne + 1
v2 = (xmod_p1 + p2mod_p1[-1-i]) % mod
# v = 0
# for j in range(N):
# v *= 2
# v %= mod
# if (X[j] == o1) ^ (i == j):
# v += 1
# v %= mod
# debug(": v, v2", v, v2)
# assert v == v2
v = v2
if v == 0:
ret[i] = 1
continue
if v < 20:
ret[i] = table[v] + 1
continue
v = f(v)
ret[i] = table[v] + 2
return ret