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

#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>    // assert
#include <cmath>      // abs など
#include <functional> // greater など
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric> // accumulate, gcd など
#include <queue>
#include <set>
#include <stdexcept>
#include <string>
#include <tuple>
#include <vector>
using namespace std;

// #include <boost/multiprecision/cpp_int.hpp>
// using namespace boost::multiprecision;

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
typedef long long ll;
// typedef int128_t ll;
// typedef cpp_int ll;

// GCC, 配列のアクセスなど
#define _GLIBCXX_DEBUG
// Clang, 配列のアクセスなど
#define _LIBCPP_DEBUG 0

#define debug(...)

//////////////// //////////////// //////////////// ////////////////
///////////////////
//////////////// //////////////// //////////////// ////////////////
///////////////////

// constexpr inline ll mod = 1'000'000'007;
constexpr int max_n = 200'000 + 5;

int n;
vector<bool> x(max_n);
vector<vector<ll>> pow2(3, vector<ll>(max_n));
vector<ll> sums(3);
int cnt;

int main() {
  // 高速な入出力
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout << setprecision(15); // 浮動小数の表示の精度

  cin >> n;
  rep(i, n) {
    char c;
    cin >> c;
    x[i] = (c == '1');
    if (x[i]) {
      cnt++;
    }
  }

  if (cnt == 0) {
    rep(i, n) { cout << '1' << '\\n'; }
    return 0;
  }

  for (int j = -1; j <= 1; j++) {
    if (cnt + j <= 0) {
      continue;
    }
    pow2[j + 1][0] = 1;
    rep(i, n) { pow2[j + 1][i + 1] = pow2[j + 1][i] * 2 % (cnt + j); }
  }
  debug(pow2[0][0]);
  debug("ををを");
  rep(j, 3) { reverse(pow2[j].begin(), pow2[j].begin() + n); }
  debug("ぬやうさあさああｓ");
  debug(pow2[0][0]);
  for (int j = -1; j <= 1; j++) {
    debug("ｎｙぽいｓだｆだ", j);
    if (cnt + j <= 0) {
      continue;
    }
    rep(i, n) {
      debug("んｄそあいｆｊさｌｋｄｋｌｄさあっｓｄｆじょいさｆぁｋふぉえｋｒｐ"
            "ｆじぇｗｋｗ",
            i, x[i]);
      if (x[i]) {
        sums[j + 1] += pow2[j + 1][i];
        sums[j + 1] %= cnt + j;
      }
    }
  }

  debug("っわああああ^^^^");
  rep(i, n) {
    if (x[i] && cnt == 1) {
      cout << 0 << '\\n';
      continue;
    }
    int tmpres = 1;
    ll tmp = 0;
    if (x[i]) {
      tmp = sums[0] - pow2[0][i];
      tmp += cnt - 1;
      tmp %= cnt - 1;
    } else {
      tmp = sums[2] + pow2[2][i];
      tmp %= cnt + 1;
    }
    while (tmp != 0) {
      tmpres++;
      tmp %= bitset<64>(tmp).count();
    }
    cout << tmpres << '\\n';
  }

  return 0;
}


Error: 0

Fixed submission:

#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>    // assert
#include <cmath>      // abs など
#include <functional> // greater など
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric> // accumulate, gcd など
#include <queue>
#include <set>
#include <stdexcept>
#include <string>
#include <tuple>
#include <vector>
using namespace std;

// #include <boost/multiprecision/cpp_int.hpp>
// using namespace boost::multiprecision;

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
typedef long long ll;
// typedef int128_t ll;
// typedef cpp_int ll;

// GCC, 配列のアクセスなど
#define _GLIBCXX_DEBUG
// Clang, 配列のアクセスなど
#define _LIBCPP_DEBUG 0

//////////////// //////////////// //////////////// ////////////////
///////////////////
//////////////// //////////////// //////////////// ////////////////
///////////////////

// constexpr inline ll mod = 1'000'000'007;
constexpr int max_n = 200'000 + 5;

int n;
vector<bool> x(max_n);
vector<vector<ll>> pow2(3, vector<ll>(max_n));
vector<ll> sums(3);
int cnt;

int main() {
  // 高速な入出力
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout << setprecision(15); // 浮動小数の表示の精度

  cin >> n;
  rep(i, n) {
    char c;
    cin >> c;
    x[i] = (c == '1');
    if (x[i]) {
      cnt++;
    }
  }

  if (cnt == 0) {
    rep(i, n) { cout << '1' << '\\n'; }
    return 0;
  }

  for (int j = -1; j <= 1; j++) {
    if (cnt + j <= 0) {
      continue;
    }
    pow2[j + 1][0] = 1;
    rep(i, n) { pow2[j + 1][i + 1] = pow2[j + 1][i] * 2 % (cnt + j); }
  }
  reverse(pow2.begin(), pow2.begin() + n);
  for (int j = -1; j <= 1; j++) {
    if (cnt + j <= 0) {
      continue;
    }
    rep(i, n) {
      if (x[i]) {
        sums[j + 1] += pow2[j + 1][i];
        sums[j + 1] %= cnt + j;
      }
    }
  }

  rep(i, n) {
    if (x[i] && cnt == 1) {
      cout << 0 << '\\n';
      continue;
    }
    int tmpres = 1;
    ll tmp = 0;
    if (x[i]) {
      tmp = sums[0] - pow2[0][i];
      tmp += cnt - 1;
      tmp %= cnt - 1;
    } else {
      tmp = sums[2] + pow2[2][i];
      tmp %= cnt + 1;
    }
    while (tmp != 0) {
      tmpres++;
      tmp %= bitset<64>(tmp).count();
    }
    cout << tmpres << '\\n';
  }

  return 0;
}