Problem p02609 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using namespace std;

#define CPP_STR(x) CPP_STR_I(x)
#define CPP_CAT(x, y) CPP_CAT_I(x, y)
#define CPP_STR_I(args...) #args
#define CPP_CAT_I(x, y) x##y

using i8 = int8_t;
using u8 = uint8_t;
using i16 = int16_t;
using u16 = uint16_t;
using i32 = int32_t;
using u32 = uint32_t;
using i64 = int64_t;
using u64 = uint64_t;

using f32 = float;
using f64 = double;

#define FOR(i, start, end)                                                     \\
  for (i64 i = (start), CPP_CAT(i, xxxx_end) = (end);                          \\
       i < CPP_CAT(i, xxxx_end); ++i)
#define REP(i, n) FOR(i, 0, n)
#define REPS(i, n) for (i64 i = 1; i <= n; ++i)
#define RREP(i, n) for (i64 i = n - 1; i >= 0; --i)
#define RREPS(i, n) for (i64 i = n; i >= 1; --i)

#define ALL(f, c, ...)                                                         \\
  (([&](decltype((c)) cccc) {                                                  \\
    return (f)(std::begin(cccc), std::end(cccc), ##__VA_ARGS__);               \\
  })(c))

#define UNIQUE(v) v.erase(unique(v.begin(), v.end()), v.end());

#define pb push_back
#define mp make_pair

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

template <typename C> i64 SIZE(const C &c) {
  return static_cast<i64>(c.size());
}

template <typename T, size_t N> i64 SIZE(const T (&)[N]) {
  return static_cast<i64>(N);
}

struct ProconInit {
  static constexpr int IOS_PREC = 15;
  static constexpr bool AUTOFLUSH = false;

  ProconInit() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(IOS_PREC);
    if (AUTOFLUSH)
      cout << unitbuf;
  }
} PROCON_INIT;

int main() {
  i64 N;
  cin >> N;
  string X;
  cin >> X;
  reverse(X.begin(), X.end());

  i64 pc0 = 0;
  REP(i, N) {
    if (X[i] == '1')
      pc0++;
  }

  auto rem0 = [&](i64 mod, vector<i64> &pow2) {
    if (mod == 0) {
      return 1L;
    }
    i64 res = 0;
    pow2[0] = 1 % mod;
    REP(i, N) {
      if (X[i] == '1') {
        res += pow2[i] % mod;
      }
      pow2[i + 1] = pow2[i] * 2;
      pow2[i + 1] %= mod;
    }
    res %= mod;
    return res;
  };

  vector<i64> pow2p1(N + 1), pow2m1(N + 1);
  i64 rem0p1 = rem0(pc0 + 1, pow2p1);
  i64 rem0m1 = rem0(pc0 - 1, pow2m1);

  vector<i64> ans(N);
  REP(i, N) {
    if (pc0 == 1 && X[i] == '1') {
      ans[i] = 0;
      continue;
    }

    i64 cnt = 1;

    i64 x;
    if (X[i] == '1') {
      x = rem0m1 - pow2m1[i];
      x %= pc0 - 1;
      if (x < 0)
        x += pc0 - 1;
    } else {
      x = rem0p1 + pow2p1[i];
      x %= pc0 + 1;
      if (x < 0)
        x += pc0 + 1;
    }

    while (x > 0) {
      x %= __builtin_popcount(x);
      cnt++;
    }

    ans[i] = cnt;
  }

  ALL(reverse, ans);
  REP(i, N) { cout << ans[i] << endl; }

  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

#define CPP_STR(x) CPP_STR_I(x)
#define CPP_CAT(x, y) CPP_CAT_I(x, y)
#define CPP_STR_I(args...) #args
#define CPP_CAT_I(x, y) x##y

using i8 = int8_t;
using u8 = uint8_t;
using i16 = int16_t;
using u16 = uint16_t;
using i32 = int32_t;
using u32 = uint32_t;
using i64 = int64_t;
using u64 = uint64_t;

using f32 = float;
using f64 = double;

#define FOR(i, start, end)                                                     \\
  for (i64 i = (start), CPP_CAT(i, xxxx_end) = (end);                          \\
       i < CPP_CAT(i, xxxx_end); ++i)
#define REP(i, n) FOR(i, 0, n)
#define REPS(i, n) for (i64 i = 1; i <= n; ++i)
#define RREP(i, n) for (i64 i = n - 1; i >= 0; --i)
#define RREPS(i, n) for (i64 i = n; i >= 1; --i)

#define ALL(f, c, ...)                                                         \\
  (([&](decltype((c)) cccc) {                                                  \\
    return (f)(std::begin(cccc), std::end(cccc), ##__VA_ARGS__);               \\
  })(c))

#define UNIQUE(v) v.erase(unique(v.begin(), v.end()), v.end());

#define pb push_back
#define mp make_pair

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

template <typename C> i64 SIZE(const C &c) {
  return static_cast<i64>(c.size());
}

template <typename T, size_t N> i64 SIZE(const T (&)[N]) {
  return static_cast<i64>(N);
}

struct ProconInit {
  static constexpr int IOS_PREC = 15;
  static constexpr bool AUTOFLUSH = false;

  ProconInit() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(IOS_PREC);
    if (AUTOFLUSH)
      cout << unitbuf;
  }
} PROCON_INIT;

int main() {
  i64 N;
  cin >> N;
  string X;
  cin >> X;
  reverse(X.begin(), X.end());

  i64 pc0 = 0;
  REP(i, N) {
    if (X[i] == '1')
      pc0++;
  }

  auto rem0 = [&](i64 mod, vector<i64> &pow2) {
    i64 res = 0;
    pow2[0] = 1 % mod;
    REP(i, N) {
      if (X[i] == '1') {
        res += pow2[i] % mod;
      }
      pow2[i + 1] = pow2[i] * 2;
      pow2[i + 1] %= mod;
    }
    res %= mod;
    return res;
  };

  vector<i64> pow2p1(N + 1), pow2m1(N + 1);
  i64 rem0p1 = rem0(pc0 + 1, pow2p1);
  i64 rem0m1 = rem0(pc0 - 1, pow2m1);

  vector<i64> ans(N);
  REP(i, N) {
    if (pc0 == 1 && X[i] == '1') {
      cout << 0 << endl;
      continue;
    }

    i64 cnt = 1;

    i64 x;
    if (X[i] == '1') {
      x = rem0m1 - pow2m1[i];
      x %= pc0 - 1;
      if (x < 0)
        x += pc0 - 1;
    } else {
      x = rem0p1 + pow2p1[i];
      x %= pc0 + 1;
      if (x < 0)
        x += pc0 + 1;
    }

    while (x > 0) {
      x %= __builtin_popcount(x);
      cnt++;
    }

    ans[i] = cnt;
  }

  ALL(reverse, ans);
  REP(i, N) { cout << ans[i] << endl; }

  return 0;
}