#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,n) for(ll i=0;i<n;i++)
#define repl(i,l,r) for(ll i=(l);i<(r);i++)
#define per(i,n) for(ll i=n-1;i>=0;i--)
#define perl(i,r,l) for(ll i=r-1;i>=l;i--)
#define fi first
#define se second
#define pb push_back
#define ins insert
#define all(x) (x).begin(),(x).end()
using vl=vector<ll>;
using vvl=vector<vector<ll>>;
const ll MOD=1000000007;
const ll MOD9=998244353;
const int inf=1e9+10;
const ll INF=4e18;
const ll dy[8]={1,0,-1,0,1,1,-1,-1};
const ll dx[8]={0,-1,0,1,1,-1,1,-1};
using Graph = vector<vector<int>>;
const double pi=acos(-1);
template<int MOD> struct Fp {
    long long val;
    constexpr Fp(long long v = 0) noexcept : val(v % MOD) {
        if (val < 0) val += MOD;
    }
    constexpr int getmod() { return MOD; }
    constexpr Fp operator - () const noexcept {
        return val ? MOD - val : 0;
    }
    constexpr Fp operator + (const Fp& r) const noexcept { return Fp(*this) += r; }
    constexpr Fp operator - (const Fp& r) const noexcept { return Fp(*this) -= r; }
    constexpr Fp operator * (const Fp& r) const noexcept { return Fp(*this) *= r; }
    constexpr Fp operator / (const Fp& r) const noexcept { return Fp(*this) /= r; }
    constexpr Fp& operator += (const Fp& r) noexcept {
        val += r.val;
        if (val >= MOD) val -= MOD;
        return *this;
    }
    constexpr Fp& operator -= (const Fp& r) noexcept {
        val -= r.val;
        if (val < 0) val += MOD;
        return *this;
    }
    constexpr Fp& operator *= (const Fp& r) noexcept {
        val = val * r.val % MOD;
        return *this;
    }
    constexpr Fp& operator /= (const Fp& r) noexcept {
        long long a = r.val, b = MOD, u = 1, v = 0;
        while (b) {
            long long t = a / b;
            a -= t * b; swap(a, b);
            u -= t * v; swap(u, v);
        }
        val = val * u % MOD;
        if (val < 0) val += MOD;
        return *this;
    }
    constexpr bool operator == (const Fp& r) const noexcept {
        return this->val == r.val;
    }
    constexpr bool operator != (const Fp& r) const noexcept {
        return this->val != r.val;
    }
    friend constexpr ostream& operator << (ostream &os, const Fp<MOD>& x) noexcept {
        return os << x.val;
    }
    friend constexpr Fp<MOD> modpow(const Fp<MOD> &a, long long n) noexcept {
        if (n == 0) return 1;
        auto t = modpow(a, n / 2);
        t = t * t;
        if (n & 1) t = t * a;
        return t;
    }
};
using mint = Fp<MOD>;
vector<bool> seen,finished;
int pos = -1;
int ca=0;
int f=0;
void dfs(const Graph &G, int v, int p) {
    seen[v] = true;
    for (auto nv : G[v]) {
        if (nv == p) continue;
        if (finished[nv]) continue;
      if (seen[nv] && !finished[nv]) {
            pos = nv;f++; 
            return;
        }
      dfs(G, nv, v);

        // サイクル検出したならば真っ直ぐに抜けていく
        if (pos != -1) {
        return;}}
      finished[v] = true;
}
    
mint calc(long long N, long long K) {
    mint res = 1;
    for (long long n = 0; n < K; ++n) {
        res *= (N - n);
        res /= (n + 1);
    }
    return res;
}
int main() {
ll n; cin>>n;
string s; cin>>s;
ll ca =0;
ll a0=0,a1=0;
ll b = 0;
ll c = 0;
ll d = 1;
ll e = 1;
ll bb[n]={};
ll cc[n]={};
rep(i,n){
if(s.at(i)=='1') ca++;}
a0 = ca - 1;
a1 = ca + 1;
if(ca==1){
for(ll i=0; i<n; i++){
if(s.at(n-1-i)=='1'){
//b += d;
//b%=a0;
c += e;
c%=a1;}
//bb[i]=d%a0;
cc[i]=e%a1;
//d*=2;
//d%=a0;
e*=2;
e%=a1;
//cout << bb[i] << " " << cc[i] << endl;
}
//cout << b << c << endl;
for(ll i=0; i<n; i++){
ll ans = 0;
if(s.at(i)=='1'){
cout << 0 << endl;
continue;}
else{
ans = c + cc[n-1-i];
ans%=a1;
}
ll t=1;
if(ans == 0 ) {cout << t << endl; continue;}
//cout << "a" << ans << endl;
while(1){
bitset<20>s(ans);
ll k = s.count();
ans%=k;
t++;
if(ans==0) break;}
cout << t << endl;}}
///
else{
for(ll i=0; i<n; i++){
if(s.at(n-1-i)=='1'){
b += d;
b%=a0;
c += e;
c%=a1;}
bb[i]=d%a0;
cc[i]=e%a1;
d*=2;
d%=a0;
e*=2;
e%=a1;
//cout << bb[i] << " " << cc[i] << endl;
}
//cout << b << c << endl;
for(ll i=0; i<n; i++){
ll ans = 0;
if(s.at(i)=='1'){
ans = b - bb[n-1-i];
if(ans <0) ans += a0;}
else{
ans = c + cc[n-1-i];
ans%=a1;
}
ll t=1;
if(ans == 0 ) {cout << t << endl; continue;}
//cout << "a" << ans << endl;
while(1){
bitset<20>s(ans);
ll k = s.count();
ans%=k;
t++;
if(ans==0) break;}
cout << t << endl;}}}

Measured memory_bytes: 6856