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

/**
 *    author:  otera
 **/
#include <algorithm>
#include <bitset>
#include <cassert>
#include <ciso646>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <utility>
#include <vector>

// #include <boost/multiprecision/cpp_dec_float.hpp>
// #include <boost/multiprecision/cpp_int.hpp>
// #include <boost/rational.hpp>

// namespace mp = boost::multiprecision;
// // 任意長整数型
// using Bint = mp::cpp_int;

using namespace std;

#define int long long
typedef long long ll;
typedef unsigned long long ul;
typedef unsigned int ui;
typedef long double ld;
const int inf = 1e9 + 7;
const ll INF = 1LL << 60;
const ll mod = 1e9 + 7;
#define rep(i, n) for (int i = 0; i < n; i++)
#define per(i, n) for (int i = n - 1; i >= 0; i--)
#define Rep(i, sta, n) for (int i = sta; i < n; i++)
#define rep1(i, n) for (int i = 1; i <= n; i++)
#define per1(i, n) for (int i = n; i >= 1; i--)
#define Rep1(i, sta, n) for (int i = sta; i <= n; i++)
typedef complex<ld> Point;
const ld eps = 1e-8;
const ld pi = acos(-1.0);
typedef pair<int, int> P;
typedef pair<ld, ld> LDP;
typedef pair<ll, ll> LP;
#define fr first
#define sc second
#define all(c) c.begin(), c.end()
#define pb push_back
#define debug(x) cerr << #x << " = " << (x) << endl;
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}

int f(int a) {
  int co = __builtin_popcount(a);
  return a % co;
}

void solve() {
  int n;
  string x;
  cin >> n >> x;
  int cnt = 0;
  rep(i, n) {
    if (x[i] == '1')
      ++cnt;
  }
  static int p[3][200200];
  rep(i, 3) p[i][0] = 1;
  p[0][0] %= (cnt + 1);
  for (int i = 1; i <= 200000; ++i) {
    p[0][i] = p[0][i - 1] * 2 % (cnt + 1);
  }
  if (cnt > 0) {
    p[1][0] %= cnt;
    for (int i = 1; i <= 200000; ++i) {
      p[1][i] = p[1][i - 1] * 2 % cnt;
    }
  }
  if (cnt - 1 > 0) {
    p[2][0] %= (cnt - 1);
    for (int i = 1; i <= 200000; ++i) {
      p[2][i] = p[2][i - 1] * 2 % (cnt - 1);
    }
  }
  // cnt + 1
  int res0 = 0;
  per(i, n) {
    res0 += (x[i] == '1' ? p[0][n - 1 - i] : 0);
    res0 %= (cnt + 1);
  }
  // cnt - 1
  int res2 = 0;
  if (cnt - 1 > 0) {
    per(i, n) {
      res2 += (x[i] == '1' ? p[2][n - 1 - i] : 0);
      res2 %= (cnt - 1);
    }
  }
  rep(i, n) {
    int co = cnt;
    if (x[i] == '0') {
      // 0
      co++;
      int cur = (res0 + p[0][n - 1 - i]) % (cnt + 1);
      int ans = 1;
      while (cur != 0) {
        ++ans;
        cur = f(cur);
      }
      cout << ans << endl;
    } else {
      // 2
      co--;
      if (co == 0) {
        cout << 0 << endl;
        continue;
      }
      int cur = (res2 - p[2][n - 1 - i] + cnt - 1) % (cnt - 1);
      int ans = 1;
      while (cur != 0) {
        ++ans;
        cur = f(cur);
      }
      cout << ans << endl;
    }
  }
}

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  // cout << fixed << setprecision(10);
  // int t; cin >> t; rep(i, t)solve();
  solve();
  return 0;
}

Error: 0

Fixed submission:

/**
 *    author:  otera
 **/
#include <algorithm>
#include <bitset>
#include <cassert>
#include <ciso646>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <utility>
#include <vector>

#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/rational.hpp>

namespace mp = boost::multiprecision;
// 任意長整数型
using Bint = mp::cpp_int;

using namespace std;

#define int long long
typedef long long ll;
typedef unsigned long long ul;
typedef unsigned int ui;
typedef long double ld;
const int inf = 1e9 + 7;
const ll INF = 1LL << 60;
const ll mod = 1e9 + 7;
#define rep(i, n) for (int i = 0; i < n; i++)
#define per(i, n) for (int i = n - 1; i >= 0; i--)
#define Rep(i, sta, n) for (int i = sta; i < n; i++)
#define rep1(i, n) for (int i = 1; i <= n; i++)
#define per1(i, n) for (int i = n; i >= 1; i--)
#define Rep1(i, sta, n) for (int i = sta; i <= n; i++)
typedef complex<ld> Point;
const ld eps = 1e-8;
const ld pi = acos(-1.0);
typedef pair<int, int> P;
typedef pair<ld, ld> LDP;
typedef pair<ll, ll> LP;
#define fr first
#define sc second
#define all(c) c.begin(), c.end()
#define pb push_back
#define debug(x) cerr << #x << " = " << (x) << endl;
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}

string toString(int x) {
  string res = "";
  while (x != 0) {
    if (x % 2 == 1)
      res += '1';
    else
      res += '0';
    x /= 2;
  }
  reverse(all(res));
  return res;
}

Bint toInt(string s) {
  Bint res = 0;
  Bint mask = 1;
  per(i, (int)s.size()) {
    if (s[i] == '1')
      res += mask;
    mask *= 2;
  }
  return res;
}

int f(string a, string b) {
  Bint A = toInt(a), B = toInt(b);
  Bint C = A % B;
  return (int)C;
}

int f(int a) {
  int co = __builtin_popcount(a);
  return a % co;
}

void solve() {
  int n;
  string x;
  cin >> n >> x;
  int cnt = 0;
  rep(i, n) {
    if (x[i] == '1')
      ++cnt;
  }
  rep(i, n) {
    string y = x;
    int co = cnt;
    if (y[i] == '0') {
      y[i] = '1';
      ++co;
    } else {
      y[i] = '0';
      --co;
    }
    int ans = 1;
    int cur = f(y, toString(co));
    while (cur != 0) {
      ++ans;
      cur = f(cur);
    }
    cout << ans << endl;
  }
}

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  // cout << fixed << setprecision(10);
  // int t; cin >> t; rep(i, t)solve();
  solve();
  return 0;
}