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# (.NET Core 3.1.201) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ProblemD
{
    class Program
    {
        static void Main(string[] args)
        {
            var N = int.Parse(Console.ReadLine());
            var X = Console.ReadLine().ToCharArray();
            var modOrg = X.Where(c => c == '1').Count();
            var modP1 = modOrg + 1;
            var modM1 = modOrg == 1 ? 1 : modOrg - 1;
            var powsP1 = new int[N];
            var powsM1 = new int[N];
            powsP1[0] = 1;
            powsM1[0] = 1;
            for (int i = 1; i < powsP1.Length; i++)
            {
                powsP1[i] = (powsP1[i - 1] * 2) % modP1;
                powsM1[i] = (powsM1[i - 1] * 2) % modM1;
            }
            powsP1 = powsP1.Reverse().ToArray();
            powsM1 = powsM1.Reverse().ToArray();
            int XModP1 = 0;
            int XModM1 = 0;
            for (int i = 0; i < X.Length; i++)
            {
                if(X[i] == '1')
                {
                    XModP1 += powsP1[i];
                    XModP1 %= modP1;
                    XModM1 += powsM1[i];
                    XModM1 %= modM1;
                }
            }
            

            var res = new int[N];
            for (int i = 0; i < X.Length; i++)
            {
                if (modOrg == 1 && X[i] == '1') res[i] = 0;
                else
                {
                    var sign = X[i] == '0';
                    var n = sign ? (XModP1 + powsP1[i]) % modP1 : (modM1 + XModM1 - powsM1[i]) % modM1;
                    res[i] = 1;
                    while (n != 0)
                    {
                        n = n % PopCount(n);
                        res[i]++;
                    }
                }
            }

            var sw = new System.IO.StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false };
            Console.SetOut(sw);

            for (int i = 0; i < N; i++)
            {
                Console.WriteLine(res[i]);
            }

            Console.Out.Flush();
        }

        static int PopCount(int x)
        {
            var res = 0;
            for (int i = 0; i < 18; i++)
                if (Bit(x, i)) res++;
            return res;
        }

        static bool Bit(long x, int digit)
        {
            return (x & (1 << digit)) > 0;
        }

        //static int div(int n, int d)
        //{
        //    int m = 1, q = 0;
        //    while (d <= n)
        //    {
        //        d <<= 1;
        //        m <<= 1;
        //    }
        //    while (1 < m)
        //    {
        //        d >>= 1;
        //        m >>= 1;
        //        if (n >= d)
        //        {
        //            n -= d;
        //            q |= m;
        //        }
        //    }
        //    return q;
        //}

        //private string DecToBin(int number)
        //{
        //    string bin = string.Empty;

        //    for (int i = 0; i < 32; i++)
        //    {
        //        bin = (number & 1).ToString() + bin;
        //        number >>= 1;
        //    }

        //    return bin.TrimStart(new char[] { '0' }); //先頭の0は省略する
        //}
    }
}