Problem p02609 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<ll, ll> p_ll;

template <class T> void debug(T itr1, T itr2) {
  auto now = itr1;
  while (now < itr2) {
    cout << *now << " ";
    now++;
  }
  cout << endl;
}
#define repr(i, from, to) for (ll i = (ll)from; i < (ll)to; i++)
#define all(vec) vec.begin(), vec.end()
#define rep(i, N) repr(i, 0, N)
#define per(i, N) for (int i = (int)N - 1; i >= 0; i--)

const ll MOD = pow(10, 9) + 7;
const ll LLINF = pow(2, 61) - 1;
const int INF = pow(2, 30) - 1;

vector<ll> fac;
void c_fac(int x = pow(10, 6) + 10) {
  fac.resize(x, true);
  rep(i, x) fac[i] = i ? (fac[i - 1] * i) % MOD : 1;
}
ll inv(ll a, ll m = MOD) {
  ll b = m, x = 1, y = 0;
  while (b != 0) {
    int d = a / b;
    a -= b * d;
    swap(a, b);
    x -= y * d;
    swap(x, y);
  }
  return (x + m) % m;
}
ll nck(ll n, ll k) { return fac[n] * inv(fac[k] * fac[n - k] % MOD) % MOD; }
ll gcd(ll a, ll b) {
  if (a < b)
    swap(a, b);
  return b == 0 ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }

ll N;
string X;
ll calc(ll n) {
  if (n <= 0)
    return 0;
  ll result = 0;
  rep(i, N) result = (result * 2 + (X[i] - '0')) % n;
  return result;
}

ll pcal(ll n) {
  ll result = 0;
  while (n) {
    ll tn = n, pcnt = 0;
    while (tn) {
      pcnt += tn % 2;
      tn /= 2;
    }
    n %= pcnt;
    result++;
  }
  return result;
}

int main() {
  cin >> N >> X;

  ll count = 0;
  rep(i, N) count += X[i] == '1';
  ll to[2] = {calc(count - 1), calc(count + 1)};
  // debug(to,to+2);
  ll p2[2][N];
  if (count - 1 > 0)
    rep(i, N) p2[0][i] =
        i == 0 ? 1 % (count - 1) : p2[0][i - 1] * 2 % (count - 1);
  rep(i, N) p2[1][i] = i == 0 ? 1 : p2[1][i - 1] * 2 % (count + 1);

  // debug(p2[0],p2[0]+N); debug(p2[1],p2[1]+N);

  rep(i, N) {
    if (X[0] == '1' && count == 1) {
      cout << 0 << endl;
      continue;
    }
    ll c1 = X[i] == '0'
                ? (to[1] + p2[1][(N - 1) - i]) % (count + 1)
                : ((to[0] - p2[0][(N - 1) - i]) % (count - 1) + (count - 1)) %
                      (count - 1);
    ll result = 1 + pcal(c1);
    cout << result << endl;
  }
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<ll, ll> p_ll;

template <class T> void debug(T itr1, T itr2) {
  auto now = itr1;
  while (now < itr2) {
    cout << *now << " ";
    now++;
  }
  cout << endl;
}
#define repr(i, from, to) for (ll i = (ll)from; i < (ll)to; i++)
#define all(vec) vec.begin(), vec.end()
#define rep(i, N) repr(i, 0, N)
#define per(i, N) for (int i = (int)N - 1; i >= 0; i--)

const ll MOD = pow(10, 9) + 7;
const ll LLINF = pow(2, 61) - 1;
const int INF = pow(2, 30) - 1;

vector<ll> fac;
void c_fac(int x = pow(10, 6) + 10) {
  fac.resize(x, true);
  rep(i, x) fac[i] = i ? (fac[i - 1] * i) % MOD : 1;
}
ll inv(ll a, ll m = MOD) {
  ll b = m, x = 1, y = 0;
  while (b != 0) {
    int d = a / b;
    a -= b * d;
    swap(a, b);
    x -= y * d;
    swap(x, y);
  }
  return (x + m) % m;
}
ll nck(ll n, ll k) { return fac[n] * inv(fac[k] * fac[n - k] % MOD) % MOD; }
ll gcd(ll a, ll b) {
  if (a < b)
    swap(a, b);
  return b == 0 ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }

ll N;
string X;
ll calc(ll n) {
  if (n <= 0)
    return 0;
  ll result = 0;
  rep(i, N) result = (result * 2 + (X[i] - '0')) % n;
  return result;
}

ll pcal(ll n) {
  ll result = 0;
  while (n) {
    ll tn = n, pcnt = 0;
    while (tn) {
      pcnt += tn % 2;
      tn /= 2;
    }
    n %= pcnt;
    result++;
  }
  return result;
}

int main() {
  cin >> N >> X;

  ll count = 0;
  rep(i, N) count += X[i] == '1';
  ll to[2] = {calc(count - 1), calc(count + 1)};
  // debug(to,to+2);
  ll p2[2][N];
  if (count - 1 > 0)
    rep(i, N) p2[0][i] =
        i == 0 ? 1 % (count - 1) : p2[0][i - 1] * 2 % (count - 1);
  rep(i, N) p2[1][i] = i == 0 ? 1 : p2[1][i - 1] * 2 % (count + 1);

  // debug(p2[0],p2[0]+N); debug(p2[1],p2[1]+N);

  rep(i, N) {
    if (X[i] == '1' && count == 1) {
      cout << 0 << endl;
      continue;
    }
    ll c1 = X[i] == '0'
                ? (to[1] + p2[1][(N - 1) - i]) % (count + 1)
                : ((to[0] - p2[0][(N - 1) - i]) % (count - 1) + (count - 1)) %
                      (count - 1);
    ll result = 1 + pcal(c1);
    cout << result << endl;
  }
  return 0;
}