Problem:
Score : 400 points

Problem Statement

Let \mathrm{popcount}(n) be the number of 1s in the binary representation of n.
For example, \mathrm{popcount}(3) = 2, \mathrm{popcount}(7) = 3, and \mathrm{popcount}(0) = 0.

Let f(n) be the number of times the following operation will be done when we repeat it until n becomes 0: "replace n with the remainder when n is divided by \mathrm{popcount}(n)." (It can be proved that, under the constraints of this problem, n always becomes 0 after a finite number of operations.)

For example, when n=7, it becomes 0 after two operations, as follows:

\mathrm{popcount}(7)=3, so we divide 7 by 3 and replace it with the remainder, 1.

\mathrm{popcount}(1)=1, so we divide 1 by 1 and replace it with the remainder, 0.

You are given an integer X with N digits in binary.
For each integer i such that 1 \leq i \leq N, let X_i be what X becomes when the i-th bit from the top is inverted.
Find f(X_1), f(X_2), \ldots, f(X_N).

Constraints

1 \leq N \leq 2 \times 10^5

X is an integer with N digits in binary, possibly with leading zeros.

Input

Input is given from Standard Input in the following format:

N
X

Output

Print N lines. The i-th line should contain the value f(X_i).

Sample Input 1

3
011

Sample Output 1

2
1
1

X_1 = 7, which will change as follows: 7 \rightarrow 1 \rightarrow 0. Thus, f(7) = 2.

X_2 = 1, which will change as follows: 1 \rightarrow 0. Thus, f(1) = 1.

X_3 = 2, which will change as follows: 2 \rightarrow 0. Thus, f(2) = 1.

Sample Input 2

23
00110111001011011001110

Sample Output 2

2
1
2
2
1
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
1
3

Solution in C++ (GCC 9.2.1) (judge verdict: Runtime Error)

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

int one_num[2000100];

// a^n mod を計算する
long long modpow(long long a, long long n, long long mod) {
    long long res = 1;
    while (n > 0) {
        if (n & 1) res = res * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return res;
}

long long popcount(long long n){
    return __builtin_popcountll(n);
}

int count_process(long long N){
    if(N == 1) return 1;
    if(N == 0) return 0;

    return count_process(N % popcount(N)) + 1;
}


int main(){
    int N;
    string X;
    cin >> N >> X;


    //Xに1が何個あるか求める
    long long one_counter = 0;
    for(int i=0; i<N; ++i){
        if( X[i] == '1' ) one_counter++;
    }

    // for(int i=0; i<=200010; ++i){
    //     one_num[i] = count_one(i);
    // }
    

    vector<long long> original_mod_cumsum_plus_one(N);
    vector<long long> original_mod_cumsum_minus_one(N);

    //mod内でで合計を計算する
    for(int i=0; i<N; ++i){
        if(X[i] == '1'){
            long long keta = modpow(2, (N-1-i), one_counter+1);
            original_mod_cumsum_plus_one[N-1-i] = keta;
        }
    }
    long long original_m_plus = 0 ;
    for(int i=0; i<N; ++i){
        original_m_plus += original_mod_cumsum_plus_one[i];
        original_m_plus %= (one_counter+1);
    }

//----
    for(int i=0; i<N; ++i){
        if(X[i] == '1'){
            long long keta = modpow(2, (N-1-i), one_counter-1);
            original_mod_cumsum_minus_one[N-1-i] = keta;
        }
    }
    long long original_m_minus = 0 ;
    for(int i=0; i<N; ++i){
        original_m_minus += original_mod_cumsum_minus_one[i];
        original_m_minus %= (one_counter-1);
    }

    //forで各桁に対して操作
    for(int i=0; i<N; ++i){
        long long res = 1;
        long long tmp_m_minus = original_m_minus;
        long long tmp_m_plus = original_m_plus;
        //0に反転する
        if(X[i] == '1'){
            tmp_m_minus -= modpow(2, (N-1-i), one_counter-1);
            if(tmp_m_minus < 0){
                tmp_m_minus += (one_counter-1);
            }
            long long tmp_one_counter = one_counter - 1 ;
            tmp_m_minus %= tmp_one_counter;

            res = count_process(tmp_m_minus) + 1;


            // while( tmp_m_minus > 0 ){
            //     long long new_tmp_m_minus = one_num[tmp_m_minus];
            //     tmp_m_minus = tmp_m_minus % new_tmp_m_minus;
            //     res++;
            // }
            // if(tmp_m_plus > 0){
            //     res += GCD_counter(tmp_m_minus, tmp_one_counter);
            // }

        }else{
            //1に反転
            tmp_m_plus += modpow(2, (N-1-i), one_counter+1);
            long long tmp_one_counter = one_counter+1;
            tmp_m_plus %= tmp_one_counter;

            res = count_process(tmp_m_plus) + 1;

            // while( tmp_m_plus > 0 ){
            //     long long new_tmp_m_plus = one_num[tmp_m_plus];
            //     tmp_m_plus = tmp_m_plus % new_tmp_m_plus;
            //     res++;
            // }
            // if(tmp_m_plus > 0){
            //     res += GCD_counter(tmp_m_plus, tmp_one_counter);
            // }
        }
        cout << res << endl;
        res = 0;
    }
}