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

#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>

#include <algorithm>
#include <bitset>
#include <complex>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

#include <cassert>
#include <functional>

typedef long long ll;
using namespace std;

#ifndef LOCAL
#define debug(...) ;
#else
#define debug(...)                                                             \\
  cerr << __LINE__ << " : " << #__VA_ARGS__ << " = " << _tostr(__VA_ARGS__)    \\
       << endl;

template <typename T> ostream &operator<<(ostream &out, const vector<T> &v);

template <typename T1, typename T2>
ostream &operator<<(ostream &out, const pair<T1, T2> &p) {
  out << "{" << p.first << ", " << p.second << "}";
  return out;
}

template <typename T> ostream &operator<<(ostream &out, const vector<T> &v) {
  out << '{';
  for (const T &item : v)
    out << item << ", ";
  out << "\\b\\b}";
  return out;
}

void _tostr_rec(ostringstream &oss) { oss << "\\b\\b \\b"; }

template <typename Head, typename... Tail>
void _tostr_rec(ostringstream &oss, Head &&head, Tail &&...tail) {
  oss << head << ", ";
  _tostr_rec(oss, forward<Tail>(tail)...);
}

template <typename... T> string _tostr(T &&...args) {
  ostringstream oss;
  int size = sizeof...(args);
  if (size > 1)
    oss << "{";
  _tostr_rec(oss, forward<T>(args)...);
  if (size > 1)
    oss << "}";
  return oss.str();
}
#endif

#define mod 1000000007              // 1e9+7(prime number)
#define INF 1000000000              // 1e9
#define LLINF 2000000000000000000LL // 2e18
#define SIZE 200010

ll power(ll k, ll n, int M) {
  ll res = 1;
  while (n > 0) {
    if (n & 1)
      res = res * k % M;
    k = k * k % M;
    n /= 2;
  }
  return res;
}

int calc(int X) {
  int res = 0;
  while (X) {
    X = X % __builtin_popcount(X);
    res++;
  }
  return res;
}

int main() {
  int N, pop = 0;
  char S[SIZE];

  scanf("%d%s", &N, S);

  ll sum = 0;
  for (int i = 0; i < N; i++) {
    pop += S[i] == '1';
    // sum = sum * 2 + (S[i] == '1');
  }

  ll sum1 = 0, sum2 = 0;

  for (int i = 0; i < N; i++) {
    if (pop - 1 > 0) {
      sum1 = (sum1 * 2 + (S[i] - '0')) % (pop - 1);
    }
    if (pop + 1 > 0) {
      sum2 = (sum2 * 2 + (S[i] - '0')) % (pop + 1);
    }
  }

  int ans;

  for (int i = 0; i < N; i++) {
    if (S[i] == '0') {
      int M = pop + 1;
      ans = calc((sum2 + power(2, N - i - 1, M)) % M) + 1;
    } else if (S[i] == '1' && pop > 1) {
      int M = pop - 1;
      ans = calc((sum1 + M - power(2, N - i - 1, M)) % M) + 1;
    } else {
      ans = 0;
    }

    debug(ans, pop, calc(sum ^ (1 << (N - i - 1))));
    printf("%d\\n", ans);
  }

  return 0;
}

Error: 0

Fixed submission:

#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>

#include <algorithm>
#include <bitset>
#include <complex>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

#include <cassert>
#include <functional>

typedef long long ll;
using namespace std;

#ifndef LOCAL
#define debug(...) ;
#else
#define debug(...)                                                             \\
  cerr << __LINE__ << " : " << #__VA_ARGS__ << " = " << _tostr(__VA_ARGS__)    \\
       << endl;

template <typename T> ostream &operator<<(ostream &out, const vector<T> &v);

template <typename T1, typename T2>
ostream &operator<<(ostream &out, const pair<T1, T2> &p) {
  out << "{" << p.first << ", " << p.second << "}";
  return out;
}

template <typename T> ostream &operator<<(ostream &out, const vector<T> &v) {
  out << '{';
  for (const T &item : v)
    out << item << ", ";
  out << "\\b\\b}";
  return out;
}

void _tostr_rec(ostringstream &oss) { oss << "\\b\\b \\b"; }

template <typename Head, typename... Tail>
void _tostr_rec(ostringstream &oss, Head &&head, Tail &&...tail) {
  oss << head << ", ";
  _tostr_rec(oss, forward<Tail>(tail)...);
}

template <typename... T> string _tostr(T &&...args) {
  ostringstream oss;
  int size = sizeof...(args);
  if (size > 1)
    oss << "{";
  _tostr_rec(oss, forward<T>(args)...);
  if (size > 1)
    oss << "}";
  return oss.str();
}
#endif

#define mod 1000000007              // 1e9+7(prime number)
#define INF 1000000000              // 1e9
#define LLINF 2000000000000000000LL // 2e18
#define SIZE 200010

ll power(ll k, ll n, int M) {
  ll res = 1;
  while (n > 0) {
    if (n & 1)
      res = res * k % M;
    k = k * k % M;
    n /= 2;
  }
  return res;
}

int calc(int X) {
  int res = 0;
  while (X) {
    X = X % __builtin_popcount(X);
    res++;
  }
  return res;
}

int main() {
  int N;
  char S[SIZE], pop = 0;

  scanf("%d%s", &N, S);

  for (int i = 0; i < N; i++) {
    pop += S[i] == '1';
  }

  ll sum1 = 0, sum2 = 0;

  for (int i = 0; i < N; i++) {
    if (pop - 1 > 0) {
      sum1 = (sum1 * 2 + (S[i] - '0')) % (pop - 1);
    }
    if (pop + 1 > 0) {
      sum2 = (sum2 * 2 + (S[i] - '0')) % (pop + 1);
    }
  }

  int ans;

  for (int i = 0; i < N; i++) {
    if (S[i] == '0') {
      int M = pop + 1;
      ans = calc((sum2 + power(2, N - i - 1, M)) % M) + 1;
    } else if (S[i] == '1' && pop > 1) {
      int M = pop - 1;
      ans = calc((sum1 + M - power(2, N - i - 1, M)) % M) + 1;
    } else {
      ans = 0;
    }
    printf("%d\\n", ans);
  }

  return 0;
}