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

#ifdef LOCAL
#define _GLIBCXX_DEBUG
#define __clock__
#else
#pragma GCC optimize("Ofast")
#endif
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using VI = vector<ll>;
using VV = vector<VI>;
using VS = vector<string>;
using PII = pair<ll, ll>;

// tourist set
template <typename A, typename B> string to_string(pair<A, B> p);

template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p);

template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p);

string to_string(const string &s) { return '"' + s + '"'; }

string to_string(const char *s) { return to_string((string)s); }

string to_string(bool b) { return (b ? "true" : "false"); }

string to_string(vector<bool> v) {
  bool first = true;
  string res = "{";
  for (int i = 0; i < static_cast<int>(v.size()); i++) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(v[i]);
  }
  res += "}";
  return res;
}

template <size_t N> string to_string(bitset<N> v) {
  string res = "";
  for (size_t i = 0; i < N; i++) {
    res += static_cast<char>('0' + v[i]);
  }
  return res;
}

template <typename A> string to_string(A v) {
  bool first = true;
  string res = "{";
  for (const auto &x : v) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(x);
  }
  res += "}";
  return res;
}

template <typename A, typename B> string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}

template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " +
         to_string(get<2>(p)) + ")";
}

template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " +
         to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")";
}

void debug_out() { cerr << '\\n'; }

template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}

#ifdef LOCAL
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// tourist set end

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

#define FOR(i, a, b) for (ll i = (a); i < (b); ++i)
#define rep(i, b) FOR(i, 0, b)
#define ALL(v) (v).begin(), (v).end()
#define p(s) cout << (s) << '\\n'
#define p2(s, t) cout << (s) << " " << (t) << '\\n'
#define br() p("")
#define pn(s) cout << (#s) << " " << (s) << '\\n'
#define SZ(x) ((int)(x).size())
#define SORT(A) sort(ALL(A))
#define RSORT(A) sort(ALL(A), greater<ll>())
#define MP make_pair
#define p_yes() p("Yes")
#define p_no() p("No")

ll SUM(VI &V) { return accumulate(ALL(V), 0LL); }

ll MIN(VI &V) { return *min_element(ALL(V)); }
ll MAX(VI &V) { return *max_element(ALL(V)); }

void print_vector(VI &V) {
  ll n = V.size();
  rep(i, n) {
    if (i)
      cout << ' ';
    cout << V[i];
  }
  cout << endl;
}

ll gcd(ll a, ll b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}

ll lcm(ll a, ll b) {
  ll g = gcd(a, b);
  return a / g * b;
}

// long double
using ld = long double;
#define EPS (1e-14)
#define equals(a, b) (fabs((a) - (b)) < EPS)

void no() {
  p_no();
  exit(0);
}
void yes() {
  p_yes();
  exit(0);
}

const ll mod = 1e9 + 7;
const ll inf = 1e18;
const double PI = acos(-1);

// snuke's mint
// auto mod int
// https://youtu.be/L8grWxBlIZ4?t=9858
// https://youtu.be/ERZuLAxZffQ?t=4807 : optimize
// https://youtu.be/8uowVvQ_-Mo?t=1329 : division
// const int mod = 1000000007;
struct mint {
  ll x; // typedef long long ll;
  mint(ll x = 0) : x((x % mod + mod) % mod) {}
  mint operator-() const { return mint(-x); }
  mint &operator+=(const mint a) {
    if ((x += a.x) >= mod)
      x -= mod;
    return *this;
  }
  mint &operator-=(const mint a) {
    if ((x += mod - a.x) >= mod)
      x -= mod;
    return *this;
  }
  mint &operator*=(const mint a) {
    (x *= a.x) %= mod;
    return *this;
  }
  mint operator+(const mint a) const {
    mint res(*this);
    return res += a;
  }
  mint operator-(const mint a) const {
    mint res(*this);
    return res -= a;
  }
  mint operator*(const mint a) const {
    mint res(*this);
    return res *= a;
  }
  mint pow(ll t) const {
    if (!t)
      return 1;
    mint a = pow(t >> 1);
    a *= a;
    if (t & 1)
      a *= *this;
    return a;
  }

  // for prime mod
  mint inv() const { return pow(mod - 2); }
  mint &operator/=(const mint a) { return (*this) *= a.inv(); }
  mint operator/(const mint a) const {
    mint res(*this);
    return res /= a;
  }
};

int popcount(signed t) { return __builtin_popcount(t); }
int popcount(ll t) { return __builtin_popcountll(t); }

// n <= 200000
VI memo;
ll f(ll n) {
  if (memo[n] != -1)
    return memo[n];
  ll cnt = 0;
  while (n) {
    cnt++;
    n %= popcount(n);
  }
  return cnt;
}

ll popcount(string &s) {
  ll cnt = 0;
  for (char c : s) {
    if (c == '1')
      cnt++;
  }
  return cnt;
}

ll A[200010][3];
// [0] : 0
// [1] : + 1
// [2] : - 1

ll pc;

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  // input
  ll N;
  cin >> N;
  string s;
  cin >> s;

  // 一般的準備
  VI X(N);
  rep(i, N) {
    if (s[i] == '1')
      X[i] = 1;
  }
  reverse(ALL(X));
  // debug(X); // X[0] = 0bit目
  // vのときの答え
  memo.resize(200010, -1);
  rep(i, 200010) { memo[i] = f(i); }

  pc = popcount(s);
  debug(pc);

  // pcが0ありうる・・・
  if (pc == 0) {
    rep(i, N) { p(1); }
    return 0;
  }

  // pc==1
  if (pc == 1) {
    debug("pc==1");
    debug(s);
    debug(X);
    rep(i, N) {
      if (s[i] == '1') {
        p(0);
      } else {
        // どこかが0->1になる
        if (s.back() == '1' or i == N - 1) {
          p(2);
        } else {
          p(1);
        }
      }
    }
    return 0;
  }

  // 以降、pc>1としてよい
  // （pc-1で割っても安心）

  debug(pc);

  // X (sを数列にして反転したもの)
  // pc (popcount)
  auto g = [&](VI &X, ll pc) {
    if (pc == 1)
      return 1LL;
    ll N = X.size();
    ll a = 1;
    ll sum = 0;
    rep(i, N) {
      // 今考えているbitの値がa
      if (X[i] == 1) {
        sum += a;
        sum %= pc;
      }
      a *= 2;
      a %= pc;
    }
    return sum;
  };

  VI T = {0, 1, 0, 1, 1};
  ll temp = g(T, 3);
  debug(temp);

  // Xをpc-1, pc, pc+1で
  VI V(3);
  V[0] = g(X, pc - 1);
  debug("0 ok");
  V[1] = g(X, pc);
  debug("1 ok");
  V[2] = g(X, pc + 1);
  debug("2 ok");
  debug(V);

  // sample2
  debug(1808078 % 12);
  debug(1808078 % 13);
  debug(1808078 % 14);

  VI offset = {-1, 0, 1};
  rep(a, 3) {
    ll off = offset[a];
    ll v = 1;
    rep(i, 200010) {
      A[i][a] = v;
      v *= 2;
      v %= pc + off;
    }
  }

  // debug(A[0][0], 1%12);
  // debug(A[1][0], 2%12);
  // debug(A[2][0], 4%12);
  // debug(A[3][0], 8%12);
  // debug(A[4][0], 16%12);
  // exit(0);

  rep(i, N) {
    // sの上からi bit目を反転
    ll ans = -1;
    if (s[i] == '0') {
      // 2^iを足して考える
      ll m = pc + 1;
      ans = V[2] + A[N - i - 1][2];
      ans %= m;
    } else {
      // 2^iを引いて考える
      ll m = pc - 1;
      ans = V[0] - A[N - i - 1][0];
      while (ans < 0)
        ans += m;
      debug(i, V[0], A[N - i - 1][0]);
      ans %= m;
      if (ans < 0)
        ans += m;
      debug(i, ans);
    }

    ll cnt = 1 + f(ans);
    debug(i, cnt, f(ans), ans);
    cerr << endl;
    p(cnt);
  }

  return 0;
}

Error: -6
a5e30224-6ae9-488f-8201-05b2b103eecb.out: /home/alex/Documents/bug-detection/input/Project_CodeNet/data/p02609/C++/s424103330.cpp:308: int main(): Assertion `1==2' failed.


Fixed submission:

#ifdef LOCAL
#define _GLIBCXX_DEBUG
#define __clock__
#else
#pragma GCC optimize("Ofast")
#endif
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using VI = vector<ll>;
using VV = vector<VI>;
using VS = vector<string>;
using PII = pair<ll, ll>;

// tourist set
template <typename A, typename B> string to_string(pair<A, B> p);

template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p);

template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p);

string to_string(const string &s) { return '"' + s + '"'; }

string to_string(const char *s) { return to_string((string)s); }

string to_string(bool b) { return (b ? "true" : "false"); }

string to_string(vector<bool> v) {
  bool first = true;
  string res = "{";
  for (int i = 0; i < static_cast<int>(v.size()); i++) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(v[i]);
  }
  res += "}";
  return res;
}

template <size_t N> string to_string(bitset<N> v) {
  string res = "";
  for (size_t i = 0; i < N; i++) {
    res += static_cast<char>('0' + v[i]);
  }
  return res;
}

template <typename A> string to_string(A v) {
  bool first = true;
  string res = "{";
  for (const auto &x : v) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(x);
  }
  res += "}";
  return res;
}

template <typename A, typename B> string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}

template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " +
         to_string(get<2>(p)) + ")";
}

template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " +
         to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")";
}

void debug_out() { cerr << '\\n'; }

template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}

#ifdef LOCAL
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
// tourist set end

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

#define FOR(i, a, b) for (ll i = (a); i < (b); ++i)
#define rep(i, b) FOR(i, 0, b)
#define ALL(v) (v).begin(), (v).end()
#define p(s) cout << (s) << '\\n'
#define p2(s, t) cout << (s) << " " << (t) << '\\n'
#define br() p("")
#define pn(s) cout << (#s) << " " << (s) << '\\n'
#define SZ(x) ((int)(x).size())
#define SORT(A) sort(ALL(A))
#define RSORT(A) sort(ALL(A), greater<ll>())
#define MP make_pair
#define p_yes() p("Yes")
#define p_no() p("No")

ll SUM(VI &V) { return accumulate(ALL(V), 0LL); }

ll MIN(VI &V) { return *min_element(ALL(V)); }
ll MAX(VI &V) { return *max_element(ALL(V)); }

void print_vector(VI &V) {
  ll n = V.size();
  rep(i, n) {
    if (i)
      cout << ' ';
    cout << V[i];
  }
  cout << endl;
}

ll gcd(ll a, ll b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}

ll lcm(ll a, ll b) {
  ll g = gcd(a, b);
  return a / g * b;
}

// long double
using ld = long double;
#define EPS (1e-14)
#define equals(a, b) (fabs((a) - (b)) < EPS)

void no() {
  p_no();
  exit(0);
}
void yes() {
  p_yes();
  exit(0);
}

const ll mod = 1e9 + 7;
const ll inf = 1e18;
const double PI = acos(-1);

// snuke's mint
// auto mod int
// https://youtu.be/L8grWxBlIZ4?t=9858
// https://youtu.be/ERZuLAxZffQ?t=4807 : optimize
// https://youtu.be/8uowVvQ_-Mo?t=1329 : division
// const int mod = 1000000007;
struct mint {
  ll x; // typedef long long ll;
  mint(ll x = 0) : x((x % mod + mod) % mod) {}
  mint operator-() const { return mint(-x); }
  mint &operator+=(const mint a) {
    if ((x += a.x) >= mod)
      x -= mod;
    return *this;
  }
  mint &operator-=(const mint a) {
    if ((x += mod - a.x) >= mod)
      x -= mod;
    return *this;
  }
  mint &operator*=(const mint a) {
    (x *= a.x) %= mod;
    return *this;
  }
  mint operator+(const mint a) const {
    mint res(*this);
    return res += a;
  }
  mint operator-(const mint a) const {
    mint res(*this);
    return res -= a;
  }
  mint operator*(const mint a) const {
    mint res(*this);
    return res *= a;
  }
  mint pow(ll t) const {
    if (!t)
      return 1;
    mint a = pow(t >> 1);
    a *= a;
    if (t & 1)
      a *= *this;
    return a;
  }

  // for prime mod
  mint inv() const { return pow(mod - 2); }
  mint &operator/=(const mint a) { return (*this) *= a.inv(); }
  mint operator/(const mint a) const {
    mint res(*this);
    return res /= a;
  }
};

int popcount(signed t) { return __builtin_popcount(t); }
int popcount(ll t) { return __builtin_popcountll(t); }

VI memo;

ll f(ll n) {
  ll cnt = 0;
  while (n) {
    cnt++;
    n %= popcount(n);
  }
  return cnt;
}

ll popcount(string &s) {
  ll cnt = 0;
  for (char c : s) {
    if (c == '1')
      cnt++;
  }
  return cnt;
}

ll A[200010][3];
// [0] : 0
// [1] : + 1
// [2] : - 1

ll pc;

ll f(ll i, ll j) {
  // 2^i
  // pc
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  // input
  ll N;
  cin >> N;
  string s;
  cin >> s;

  // 一般的準備
  VI X(N);
  rep(i, N) {
    if (s[i] == '1')
      X[i] = 1;
  }
  reverse(ALL(X));
  // debug(X); // X[0] = 0bit目
  // vのときの答え
  memo.resize(200010);
  FOR(i, 1, 200010) { memo[i] = f(i); }

  pc = popcount(s);
  debug(pc);

  // pcが0ありうる・・・
  if (pc == 0) {
    rep(i, N) { p(1); }
    return 0;
  }

  // pc==1
  if (pc == 1) {
    debug("pc==1");
    debug(s);
    debug(X);
    rep(i, N) {
      if (s[i] == '1') {
        p(0);
      } else {
        // どこかが0->1になる
        if (s.back() == '1' or i == N - 1) {
          p(2);
        } else {
          p(1);
        }
      }
    }
    return 0;
  }
  //

  assert(1 == 2);

  // j==0 (pc==pc)
  {
    ll v = 1;
    FOR(i, 1, 200010) {
      v *= 2;
      v %= pc;
      A[i][0];
    }
  }
  // j==1 (pc+1)
  // j==2 (pc-1)

  rep(i, 200010) {
    rep(j, 3) { A[i][j] = -1; }
  }

  ll o = 0; // original
  rep(i, N) {
    ll ans;
    ll mod = pc;
    // ibit目を反転
    if (X[i] == 0) {
      mod++;
      // 2^iを足して考える
      // ans = f(o + pow(2,i), pc+1);
      // ans = f(o, pc+1) + f(pow(2,i), pc+1);
      ans = f(o, pc + 1) + A[i][1];
      ans %= mod;
      if (ans < 0)
        ans += mod;
      ans = f(ans);
    } else {
      // mod--;
      // ans = f(o - pow(2,i), pc-1);
      // TODO
    }
    p(ans);
  }

  // p(f(7));
  // p(f(1));
  // p(f(2));

  // // じっけん
  // FOR(v,1,200){
  //   // cerr<<endl;
  //   debug(v, v%popcount(v));
  // }
  // exit(0);

  // bitset<200010> bs_original(0);
  // rep(i,N){

  //   bs_original[i] = 1;
  // }

  // rep(i,N){
  //   // i bit目を反転
  //   auto bs = bs_original;
  //   bs.flip(i);
  //   ll cnt=0;
  //   while(bs.count()){
  //     bs %= bs.count();
  //   }
  // }

  return 0;
}