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

#include <bits/stdc++.h>
// #include <boost/multiprecision/cpp_int.hpp>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
#pragma GCC optimize("O3")
#define REP(i, n) for (int i = 0; i < n; i++)
#define REPP(i, n) for (int i = 1; i <= n; i++)
#define ALL(obj) (obj).begin(), (obj).end()
#define EPS (1e-9)
#define INF (1e17)
#define PI (acos(-1))
// const double PI = acos(-1);
// const double EPS = 1e-15;
// long long INF=(long long)1E17;
#define i_7 (long long)(1e9 + 7)
// #define i_7 998'244'353
long mod(long a) {
  long long c = a % i_7;
  if (c >= 0)
    return c;
  return c + i_7;
}
long long po(long a, long b) {
  if (b == 0) {
    return 1;
  }

  long long z = po(a, b / 2);
  z = mod(z * z);
  if (b % 2 != 0) {
    z = mod(a * z);
  }
  return z;
}

bool prime_(int n) {
  if (n == 1) {
    return false;
  } else if (n == 2) {
    return true;
  } else {
    for (int i = 2; i <= std::sqrt(n); i++) {
      if (n % i == 0) {
        return false;
      }
    }
    return true;
  }
}

long long gcd_(long long a, long long b) {
  if (a < b) {
    std::swap(a, b);
  }
  if (a % b == 0) {
    return b;
  } else {
    return gcd_(b, a % b);
  }
}

long long lcm_(long long x, long long y) { return (x / gcd_(x, y)) * y; }

// using namespace std;
// using namespace boost::multiprecision;
// using namespace __gnu_pbds;

int main() {
  using namespace std;
  int n;
  cin >> n;
  string x;
  cin >> x;
  int px = 0;
  int pxm, pxp;
  REP(i, n) if (x[i] == '1') px++;
  pxm = px - 1;
  pxp = px + 1;
  int powers[n];
  int powersm[n];
  int powersp[n];
  for (int i = n - 1; i >= 0; i--) {
    if (i == n - 1) {
      powers[i] = 1;
      powersm[i] = 1;
      powersp[i] = 1;
      continue;
    } else {
      powers[i] = (powers[i + 1] * 2) % px;
      if (pxm > 0) {
        powersm[i] = (powersm[i + 1] * 2) % pxm;
      }
      powersp[i] = (powersp[i + 1] * 2) % pxp;
    }
  }
  int modx = 0;
  int modxp = 0;
  int modxm = 0;
  REP(i, n) {
    modx += ((x[i] - '0') * powers[i]);
    modx %= px;
    modxm += ((x[i] - '0') * powersm[i]);
    if (pxm > 0)
      modxm %= pxm;
    modxp += ((x[i] - '0') * powersp[i]);
    modxp %= pxp;
  }
  vector<int> ans(n, 0);
  REP(i, n) {
    int cnt = 1;
    long long temp;
    if (x[i] == '0') {
      temp = (modxp + powersp[i]) % pxp;
    } else {
      if (pxm == 0) {
        ans[i] = 0;
        continue;
      }
      temp = ((modxm - powersm[i]) % pxm + pxm) % pxm;
    }
    while (temp > 0) {
      int p = __builtin_popcount(temp);
      temp %= p;
      cnt++;
    }
    ans[i] = cnt;
  }
  REP(i, n) cout << ans[i] << endl;
  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>
// #include <boost/multiprecision/cpp_int.hpp>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
#pragma GCC optimize("O3")
#define REP(i, n) for (int i = 0; i < n; i++)
#define REPP(i, n) for (int i = 1; i <= n; i++)
#define ALL(obj) (obj).begin(), (obj).end()
#define EPS (1e-9)
#define INF (1e17)
#define PI (acos(-1))
// const double PI = acos(-1);
// const double EPS = 1e-15;
// long long INF=(long long)1E17;
#define i_7 (long long)(1e9 + 7)
// #define i_7 998'244'353
long mod(long a) {
  long long c = a % i_7;
  if (c >= 0)
    return c;
  return c + i_7;
}
long long po(long a, long b) {
  if (b == 0) {
    return 1;
  }

  long long z = po(a, b / 2);
  z = mod(z * z);
  if (b % 2 != 0) {
    z = mod(a * z);
  }
  return z;
}

bool prime_(int n) {
  if (n == 1) {
    return false;
  } else if (n == 2) {
    return true;
  } else {
    for (int i = 2; i <= std::sqrt(n); i++) {
      if (n % i == 0) {
        return false;
      }
    }
    return true;
  }
}

long long gcd_(long long a, long long b) {
  if (a < b) {
    std::swap(a, b);
  }
  if (a % b == 0) {
    return b;
  } else {
    return gcd_(b, a % b);
  }
}

long long lcm_(long long x, long long y) { return (x / gcd_(x, y)) * y; }

// using namespace std;
// using namespace boost::multiprecision;
// using namespace __gnu_pbds;

int main() {
  using namespace std;
  int n;
  cin >> n;
  string x;
  cin >> x;
  int px = 0;
  int pxm, pxp;
  REP(i, n) if (x[i] == '1') px++;
  pxm = px - 1;
  pxp = px + 1;
  int powers[n];
  int powersm[n];
  int powersp[n];
  for (int i = n - 1; i >= 0; i--) {
    if (i == n - 1) {
      powers[i] = 1;
      powersm[i] = 1;
      powersp[i] = 1;
      continue;
    } else {
      powers[i] = (powers[i + 1] * 2) % px;
      powersm[i] = (powersm[i + 1] * 2) % pxm;
      powersp[i] = (powersp[i + 1] * 2) % pxp;
    }
  }
  int modx = 0;
  int modxp = 0;
  int modxm = 0;
  REP(i, n) {
    modx += ((x[i] - '0') * powers[i]);
    modx %= px;
    modxm += ((x[i] - '0') * powersm[i]);
    modxm %= pxm;
    modxp += ((x[i] - '0') * powersp[i]);
    modxp %= pxp;
  }
  vector<int> ans(n, 0);
  REP(i, n) {
    int cnt = 1;
    long long temp;
    if (x[i] == '0') {
      temp = (modxp + powersp[i]) % pxp;
    } else {
      temp = ((modxm - powersm[i]) % pxm + pxm) % pxm;
    }
    while (temp > 0) {
      int p = __builtin_popcount(temp);
      temp %= p;
      cnt++;
    }
    ans[i] = cnt;
  }
  REP(i, n) cout << ans[i] << endl;
  return 0;
}