Problem p02609 (C++)

Buggy submission (status: Runtime Error):
#define _GLIBCXX_DEBUG
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;
using vl = vector<ll>;
#define rep0(TMS) for (int CNT = 0; CNT < (int)(TMS); CNT++)
#define rep(CNT, GOAL) for (int CNT = 0; CNT < (int)(GOAL); CNT++)
#define rep2(CNT, START, GOAL)                                                 \
  for (int CNT = (int)(START); CNT < (int)(GOAL); CNT++)
#define rep3(CNT, START, GOAL)                                                 \
  for (int CNT = (int)(START); CNT > (int)(GOAL); CNT--)
#define all(CONT) begin(CONT), end(CONT)
#define itrep(ITR, CONT) for (auto ITR = begin(CONT); ITR != end(CONT); ITR++)
#define itrep1(ITR, CONT)                                                      \
  for (auto ITR = next(begin(CONT)); ITR != end(CONT); ITR++)
template <typename T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
void prec(const int &DIG) {
  cerr << fixed << setprecision(DIG);
  cout << fixed << setprecision(DIG);
}
template <typename T> void CERR(const T &ELEM) { cerr << ELEM; }
template <typename T, typename... Ts>
void CERR(const T &FIRST, const Ts &...REST) {
  CERR(FIRST);
  cerr << ", ";
  CERR(REST...);
}
template <typename T1, typename T2> void CERR(const pair<T1, T2> &PAIR) {
  cerr << "(";
  CERR(PAIR.first);
  cerr << ", ";
  CERR(PAIR.second);
  cerr << ")";
}
template <typename T> void CERR(const vector<T> &VEC) {
  cerr << "{ ";
  itrep(ITR, VEC) {
    CERR(*ITR);
    cerr << ", ";
  }
  cerr << "}";
}
template <typename T> void CERR1(const vector<T> &VEC) {
  cerr << "{ ";
  itrep1(ITR, VEC) {
    CERR(*ITR);
    cerr << ", ";
  }
  cerr << "}";
}
template <typename T> void CERR(const set<T> &SET) {
  cerr << "{ ";
  itrep(ITR, SET) {
    CERR(*ITR);
    cerr << ", ";
  }
  cerr << "}";
}
template <typename T> void CERR(const multiset<T> &MULTISET) {
  cerr << "{ ";
  itrep(ITR, MULTISET) {
    CERR(*ITR);
    cerr << ", ";
  }
  cerr << "}";
}
template <typename T1, typename T2> void CERR(const map<T1, T2> &MAP) {
  cerr << "{ ";
  itrep(ITR, MAP) {
    CERR(*ITR);
    cerr << ", ";
  }
  cerr << "}";
}
#define db(OBJ)                                                                \
  cerr << #OBJ << ": ";                                                        \
  CERR(OBJ);                                                                   \
  cerr << ", "
#define dbl(OBJ)                                                               \
  cerr << #OBJ << ": ";                                                        \
  CERR(OBJ);                                                                   \
  cerr << "\n"
#define db1(OBJ)                                                               \
  cerr << #OBJ << ": ";                                                        \
  CERR1(OBJ);                                                                  \
  cerr << "\n"
#define dbs(...)                                                               \
  cerr << "(" << #__VA_ARGS__ << "): (";                                       \
  CERR(__VA_ARGS__);                                                           \
  cerr << ")\n"
#define dbvv(VV)                                                               \
  cerr << #VV << ": {\n";                                                      \
  rep(CNT, VV.size()) {                                                        \
    cerr << #VV << "[" << CNT << "]: ";                                        \
    CERR(VV[CNT]);                                                             \
    cerr << ",\n";                                                             \
  }                                                                            \
  cerr << "}\n"
#define db01(VV)                                                               \
  cerr << #VV << ": {\n";                                                      \
  rep(CNT, VV.size()) {                                                        \
    cerr << #VV << "[" << CNT << "]: ";                                        \
    CERR1(VV[CNT]);                                                            \
    cerr << ",\n";                                                             \
  }                                                                            \
  cerr << "}\n"
#define db10(VV)                                                               \
  cerr << #VV << ": {\n";                                                      \
  rep2(CNT, 1, VV.size()) {                                                    \
    cerr << #VV << "[" << CNT << "]: ";                                        \
    CERR(VV[CNT]);                                                             \
    cerr << ",\n";                                                             \
  }                                                                            \
  cerr << "}\n"
#define db11(VV)                                                               \
  cerr << #VV << ": {\n";                                                      \
  rep2(CNT, 1, VV.size()) {                                                    \
    cerr << #VV << "[" << CNT << "]: ";                                        \
    CERR1(VV[CNT]);                                                            \
    cerr << ",\n";                                                             \
  }                                                                            \
  cerr << "}\n"
#define YN(FLG) cout << (FLG ? "YES" : "NO") << "\n"
#define Yn(FLG) cout << (FLG ? "Yes" : "No") << "\n"
#define yn(FLG) cout << (FLG ? "yes" : "no") << "\n"
// const ll INF = 1'000'000'000'000'000'007;
const int INF = 1'000'000'007; // Bについて，傾きが20億になることがある(?)
const ll MOD = 1'000'000'007; // 998'244'353;

int N;
string X;
vi fx;

int f(int n) {
  int res = 0;
  while (n > 0) {
    n = n % __builtin_popcount(n);
    res++;
  }
  return res;
}

int solve(int x) {
  int res = 1;
  rep(i, N) {
    x = f(x);
    res++;
  }
  return res;
}

int main() {
  cin >> N;
  cin >> X;
  reverse(all(X));
  int p = 0;
  rep(i, N) if (X[i] == '1') p++;
  // dbl(X); dbl(p);
  // Nをp+1,p-1で割った余り
  int r1 = 0, r2 = 0, R1 = 1, R2 = 1;
  rep(i, N) {
    if (X[i] == '1') {
      r1 = (r1 + R1) % (p + 1);
      r2 = (r2 + R2) % (p - 1);
    }
    R1 = (R1 * 2) % (p + 1);
    R2 = (R2 * 2) % (p - 1);
  }
  // dbs(r1, r2);
  fx = vi(N);
  int s1 = 1, s2 = 1; // 2^i%(p+1),2^i%(p-1)
  rep(i, N) {
    if (X[i] == '1') {
      fx[i] = ((r2 - s2) + (p - 1)) % (p - 1);
    } else if (X[i] == '0') {
      fx[i] = (r1 + s1) % (p + 1);
    }
    s1 = (s1 * 2) % (p + 1);
    s2 = (s2 * 2) % (p - 1);
  }
  // dbvv(fx);
  rep3(i, N - 1, -1) cout << f(fx[i]) + 1 << endl;
}

Fixed submission:
#define _GLIBCXX_DEBUG
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;
using vl = vector<ll>;
#define rep0(TMS) for (int CNT = 0; CNT < (int)(TMS); CNT++)
#define rep(CNT, GOAL) for (int CNT = 0; CNT < (int)(GOAL); CNT++)
#define rep2(CNT, START, GOAL)                                                 \
  for (int CNT = (int)(START); CNT < (int)(GOAL); CNT++)
#define rep3(CNT, START, GOAL)                                                 \
  for (int CNT = (int)(START); CNT > (int)(GOAL); CNT--)
#define all(CONT) begin(CONT), end(CONT)
#define itrep(ITR, CONT) for (auto ITR = begin(CONT); ITR != end(CONT); ITR++)
#define itrep1(ITR, CONT)                                                      \
  for (auto ITR = next(begin(CONT)); ITR != end(CONT); ITR++)
template <typename T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
void prec(const int &DIG) {
  cerr << fixed << setprecision(DIG);
  cout << fixed << setprecision(DIG);
}
template <typename T> void CERR(const T &ELEM) { cerr << ELEM; }
template <typename T, typename... Ts>
void CERR(const T &FIRST, const Ts &...REST) {
  CERR(FIRST);
  cerr << ", ";
  CERR(REST...);
}
template <typename T1, typename T2> void CERR(const pair<T1, T2> &PAIR) {
  cerr << "(";
  CERR(PAIR.first);
  cerr << ", ";
  CERR(PAIR.second);
  cerr << ")";
}
template <typename T> void CERR(const vector<T> &VEC) {
  cerr << "{ ";
  itrep(ITR, VEC) {
    CERR(*ITR);
    cerr << ", ";
  }
  cerr << "}";
}
template <typename T> void CERR1(const vector<T> &VEC) {
  cerr << "{ ";
  itrep1(ITR, VEC) {
    CERR(*ITR);
    cerr << ", ";
  }
  cerr << "}";
}
template <typename T> void CERR(const set<T> &SET) {
  cerr << "{ ";
  itrep(ITR, SET) {
    CERR(*ITR);
    cerr << ", ";
  }
  cerr << "}";
}
template <typename T> void CERR(const multiset<T> &MULTISET) {
  cerr << "{ ";
  itrep(ITR, MULTISET) {
    CERR(*ITR);
    cerr << ", ";
  }
  cerr << "}";
}
template <typename T1, typename T2> void CERR(const map<T1, T2> &MAP) {
  cerr << "{ ";
  itrep(ITR, MAP) {
    CERR(*ITR);
    cerr << ", ";
  }
  cerr << "}";
}
#define db(OBJ)                                                                \
  cerr << #OBJ << ": ";                                                        \
  CERR(OBJ);                                                                   \
  cerr << ", "
#define dbl(OBJ)                                                               \
  cerr << #OBJ << ": ";                                                        \
  CERR(OBJ);                                                                   \
  cerr << "\n"
#define db1(OBJ)                                                               \
  cerr << #OBJ << ": ";                                                        \
  CERR1(OBJ);                                                                  \
  cerr << "\n"
#define dbs(...)                                                               \
  cerr << "(" << #__VA_ARGS__ << "): (";                                       \
  CERR(__VA_ARGS__);                                                           \
  cerr << ")\n"
#define dbvv(VV)                                                               \
  cerr << #VV << ": {\n";                                                      \
  rep(CNT, VV.size()) {                                                        \
    cerr << #VV << "[" << CNT << "]: ";                                        \
    CERR(VV[CNT]);                                                             \
    cerr << ",\n";                                                             \
  }                                                                            \
  cerr << "}\n"
#define db01(VV)                                                               \
  cerr << #VV << ": {\n";                                                      \
  rep(CNT, VV.size()) {                                                        \
    cerr << #VV << "[" << CNT << "]: ";                                        \
    CERR1(VV[CNT]);                                                            \
    cerr << ",\n";                                                             \
  }                                                                            \
  cerr << "}\n"
#define db10(VV)                                                               \
  cerr << #VV << ": {\n";                                                      \
  rep2(CNT, 1, VV.size()) {                                                    \
    cerr << #VV << "[" << CNT << "]: ";                                        \
    CERR(VV[CNT]);                                                             \
    cerr << ",\n";                                                             \
  }                                                                            \
  cerr << "}\n"
#define db11(VV)                                                               \
  cerr << #VV << ": {\n";                                                      \
  rep2(CNT, 1, VV.size()) {                                                    \
    cerr << #VV << "[" << CNT << "]: ";                                        \
    CERR1(VV[CNT]);                                                            \
    cerr << ",\n";                                                             \
  }                                                                            \
  cerr << "}\n"
#define YN(FLG) cout << (FLG ? "YES" : "NO") << "\n"
#define Yn(FLG) cout << (FLG ? "Yes" : "No") << "\n"
#define yn(FLG) cout << (FLG ? "yes" : "no") << "\n"
// const ll INF = 1'000'000'000'000'000'007;
const int INF = 1'000'000'007; // Bについて，傾きが20億になることがある(?)
const ll MOD = 1'000'000'007; // 998'244'353;

int N;
string X;
vi fx;

int f(int n) {
  int res = 0;
  while (n > 0) {
    n = n % __builtin_popcount(n);
    res++;
  }
  return res;
}

int solve(int x) {
  int res = 1;
  rep(i, N) {
    x = f(x);
    res++;
  }
  return res;
}

int main() {
  cin >> N;
  cin >> X;
  reverse(all(X));
  int p = 0;
  rep(i, N) if (X[i] == '1') p++;
  if (p == 0) {
    rep(i, N) cout << 1 << endl;
    return 0;
  } else if (p == 1) {
    int k;
    rep(i, N) if (X[i] == '1') k = i;
    rep3(i, N - 1, -1) {
      if (i == k)
        cout << 0 << endl;
      else if (k == 0)
        cout << 2 << endl;
      else if (i == 0)
        cout << 2 << endl;
      else
        cout << 1 << endl;
    }
    return 0;
  }

  // dbl(X); dbl(p);
  // Nをp+1,p-1で割った余り
  int r1 = 0, r2 = 0, R1 = 1, R2 = 1;
  rep(i, N) {
    if (X[i] == '1') {
      r1 = (r1 + R1) % (p + 1);
      r2 = (r2 + R2) % (p - 1);
    }
    R1 = (R1 * 2) % (p + 1);
    R2 = (R2 * 2) % (p - 1);
  }
  // dbs(r1, r2);
  fx = vi(N);
  int s1 = 1, s2 = 1; // 2^i%(p+1),2^i%(p-1)
  rep(i, N) {
    if (X[i] == '1') {
      fx[i] = ((r2 - s2) + (p - 1)) % (p - 1);
    } else if (X[i] == '0') {
      fx[i] = (r1 + s1) % (p + 1);
    }
    s1 = (s1 * 2) % (p + 1);
    s2 = (s2 * 2) % (p - 1);
  }
  // dbvv(fx);
  rep3(i, N - 1, -1) cout << f(fx[i]) + 1 << endl;
}