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

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

#define $(x) (int)((x).size())
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define endl '\\n'
#define x first
#define y second
#define int long long
#define double long double
#define pii pair<int, int>
#define pb push_back
#define vec vector
#define beg begin
#define dbg(x) cout << #x << " = " << x << endl;

template <class T> ostream &operator<<(ostream &str, vector<T> &a) {
  for (auto &i : a) {
    str << i << " ";
  }
  return str;
}

template <class T> istream &operator>>(istream &str, vector<T> &a) {
  for (auto &i : a) {
    str >> i;
  }
  return str;
}

template <class T> ostream &operator<<(ostream &str, pair<T, T> &a) {
  str << a.first << " " << a.second;
  return str;
}

template <class T> istream &operator>>(istream &str, pair<T, T> &a) {
  str >> a.first >> a.second;
  return str;
}

void solve();
signed main() {
#ifdef LOCAL
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
#endif
  srand(time(0));
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout.setf(ios::fixed);
  cout.precision(6);
  solve();
  return 0;
}

const int MOD = 1e9 + 7, MAXN = 5e5 + 10, INF = 2e9 + 10, BASE = 37;

int bin_pow(int num, int n, int mod) {
  if (n == 0) {
    return 1;
  }
  if (n & 1) {
    return num * bin_pow(num, n - 1, mod) % mod;
  } else {
    int tmp = bin_pow(num, n / 2, mod);
    return tmp * tmp % mod;
  }
}

void solve() {
  int n;
  cin >> n;
  string s;
  cin >> s;
  int cnt = 0;
  for (int i = 0; i < n; ++i) {
    if (s[i] == '1') {
      cnt++;
    }
  }
  int mod1 = cnt - 1, mod2 = cnt, mod3 = cnt + 1;

  if (mod1 == -1) {
    for (int i = 0; i < n; ++i) {
      if (s[i] == '1') {
        cout << 0 << endl;
      } else
        cout << 1 << endl;
    }
    return;
  }

  vec<int> s1(n + 1), s2(n + 1), s3(n + 1);
  vec<int> p1(n + 1), p2(n + 1), p3(n + 1);
  if (s[0] == '1') {
    if (mod1 > 0)
      p1[n - 1] = bin_pow(2, n - 1, mod1);
    p2[n - 1] = bin_pow(2, n - 1, mod2);
    p3[n - 1] = bin_pow(2, n - 1, mod3);
  }
  for (int i = 1; i < n; ++i) {
    p1[n - i - 1] = p1[n - i];
    if (s[i] == '1') {
      if (mod1 > 0)
        p1[n - i - 1] = (p1[n - i - 1] + bin_pow(2, n - i - 1, mod1)) % mod1;
    }

    p2[n - i - 1] = p2[n - i];
    if (s[i] == '1') {
      p2[n - i - 1] = (p2[n - i - 1] + bin_pow(2, n - i - 1, mod2)) % mod2;
    }

    p3[n - i - 1] = p3[n - i];
    if (s[i] == '1') {
      p3[n - i - 1] = (p3[n - i - 1] + bin_pow(2, n - i - 1, mod3)) % mod3;
    }
  }

  if (s[n - 1] == '1') {
    if (mod1 > 0)
      s1[0] = 1 % mod1;
    s2[0] = 1 % mod2;
    s3[0] = 1 % mod3;
  }
  for (int i = n - 2; i >= 0; --i) {
    s1[n - i - 1] = s1[n - i - 2];
    if (s[i] == '1') {
      if (mod1 > 0)
        s1[n - i - 1] = (s1[n - i - 1] + bin_pow(2, n - i - 1, mod1)) % mod1;
    }

    s2[n - i - 1] = s2[n - i - 2];
    if (s[i] == '1') {
      s2[n - i - 1] = (s2[n - i - 1] + bin_pow(2, n - i - 1, mod2)) % mod2;
    }

    s3[n - i - 1] = s3[n - i - 2];
    if (s[i] == '1') {
      s3[n - i - 1] = (s3[n - i - 1] + bin_pow(2, n - i - 1, mod3)) % mod3;
    }
  }

  for (int i = 0; i < n; ++i) {
    int p = n - i - 1;
    int sum = 0;
    if (s[i] == '0') {
      sum = (bin_pow(2, p, mod3) + (p + 1 == n ? 0 : p3[p + 1]) +
             (p - 1 >= 0 ? s3[p - 1] : 0)) %
            mod3;
    } else {
      if (mod1 == 0) {
        sum = 0;
      } else
        sum = ((p + 1 == n ? 0 : p1[p + 1]) + (p - 1 >= 0 ? s1[p - 1] : 0)) %
              mod1;
    }
    int ans = 1;
    if (mod1 == 0 && s[i] == '1')
      ans = 0;
    int x = sum;
    while (x > 0) {
      ans++;
      x %= __builtin_popcount(x);
    }
    cout << ans << endl;
  }
}

Error: 0

Fixed submission:

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

#define $(x) (int)((x).size())
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define endl '\\n'
#define x first
#define y second
#define int long long
#define double long double
#define pii pair<int, int>
#define pb push_back
#define vec vector
#define beg begin
#define dbg(x) cout << #x << " = " << x << endl;

template <class T> ostream &operator<<(ostream &str, vector<T> &a) {
  for (auto &i : a) {
    str << i << " ";
  }
  return str;
}

template <class T> istream &operator>>(istream &str, vector<T> &a) {
  for (auto &i : a) {
    str >> i;
  }
  return str;
}

template <class T> ostream &operator<<(ostream &str, pair<T, T> &a) {
  str << a.first << " " << a.second;
  return str;
}

template <class T> istream &operator>>(istream &str, pair<T, T> &a) {
  str >> a.first >> a.second;
  return str;
}

void solve();
signed main() {
#ifdef LOCAL
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
#endif
  srand(time(0));
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout.setf(ios::fixed);
  cout.precision(6);
  solve();
  return 0;
}

const int MOD = 1e9 + 7, MAXN = 5e5 + 10, INF = 2e9 + 10, BASE = 37;

int bin_pow(int num, int n, int mod) {
  if (n == 0) {
    return 1;
  }
  if (n & 1) {
    return num * bin_pow(num, n - 1, mod) % mod;
  } else {
    int tmp = bin_pow(num, n / 2, mod);
    return tmp * tmp % mod;
  }
}

void solve() {
  int n;
  cin >> n;
  string s;
  cin >> s;
  int cnt = 0;
  for (int i = 0; i < n; ++i) {
    if (s[i] == '1') {
      cnt++;
    }
  }
  int mod1 = cnt - 1, mod2 = cnt, mod3 = cnt + 1;

  if (mod1 == -1) {
    for (int i = 0; i < n; ++i) {
      if (s[i] == '1') {
        cout << 0 << endl;
      } else
        cout << 1 << endl;
    }
    return;
  }

  vec<int> s1(n + 1), s2(n + 1), s3(n + 1);
  vec<int> p1(n + 1), p2(n + 1), p3(n + 1);
  if (s[0] == '1') {
    p1[n - 1] = bin_pow(2, n - 1, mod1);
    p2[n - 1] = bin_pow(2, n - 1, mod2);
    p3[n - 1] = bin_pow(2, n - 1, mod3);
  }
  for (int i = 1; i < n; ++i) {
    p1[n - i - 1] = p1[n - i];
    if (s[i] == '1') {
      p1[n - i - 1] = (p1[n - i - 1] + bin_pow(2, n - i - 1, mod1)) % mod1;
    }

    p2[n - i - 1] = p2[n - i];
    if (s[i] == '1') {
      p2[n - i - 1] = (p2[n - i - 1] + bin_pow(2, n - i - 1, mod2)) % mod2;
    }

    p3[n - i - 1] = p3[n - i];
    if (s[i] == '1') {
      p3[n - i - 1] = (p3[n - i - 1] + bin_pow(2, n - i - 1, mod3)) % mod3;
    }
  }

  if (s[n - 1] == '1') {
    s1[0] = 1 % mod1;
    s2[0] = 1 % mod2;
    s3[0] = 1 % mod3;
  }
  for (int i = n - 2; i >= 0; --i) {
    s1[n - i - 1] = s1[n - i - 2];
    if (s[i] == '1') {
      s1[n - i - 1] = (s1[n - i - 1] + bin_pow(2, n - i - 1, mod1)) % mod1;
    }

    s2[n - i - 1] = s2[n - i - 2];
    if (s[i] == '1') {
      s2[n - i - 1] = (s2[n - i - 1] + bin_pow(2, n - i - 1, mod2)) % mod2;
    }

    s3[n - i - 1] = s3[n - i - 2];
    if (s[i] == '1') {
      s3[n - i - 1] = (s3[n - i - 1] + bin_pow(2, n - i - 1, mod3)) % mod3;
    }
  }

  for (int i = 0; i < n; ++i) {
    int p = n - i - 1;
    int sum = 0;
    if (s[i] == '0') {
      sum = (bin_pow(2, p, mod3) + (p + 1 == n ? 0 : p3[p + 1]) +
             (p - 1 >= 0 ? s3[p - 1] : 0)) %
            mod3;
    } else {
      if (mod1 == 0) {
        sum = 0;
      } else
        sum = ((p + 1 == n ? 0 : p1[p + 1]) + (p - 1 >= 0 ? s1[p - 1] : 0)) %
              mod1;
    }
    int ans = 1;
    int x = sum;
    while (x > 0) {
      ans++;
      x %= __builtin_popcount(x);
    }
    cout << ans << endl;
  }
}