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

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
using ll = long long;
using P = pair<ll, ll>;
// マクロ
// forループ関係
// 引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
// Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define FOR(i, a, b) for (ll i = a; i <= (ll)(b); i++)
// xにはvectorなどのコンテナ
#define ALL(x) (x).begin(), (x).end() // sortなどの引数を省略したい
#define SIZE(x) ((ll)(x).size())      // sizeをsize_tからllに直しておく
#define MAX(x) *max_element(ALL(x))   // 最大値を求める
#define MIN(x) *min_element(ALL(x))   // 最小値を求める
// 定数
#define INF 1000000000000 // 10^12:極めて大きい値,∞
#define inf 2147483647    // int値の最大値
#define MOD 1000000007    // 10^9+7:合同式の法
#define MAXR 100000 // 10^5:配列の最大のrange(素数列挙などで使用)
// 略記
#define PB push_back                            // vectorヘの挿入
#define MP make_pair                            // pairのコンストラクタ
#define F first                                 // pairの一つ目の要素
#define S second                                // pairの二つ目の要素
#define CST(x) cout << fixed << setprecision(x) // 小数点以下の桁数指定
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
int gcd(int a, int b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
int lcm(int a, int b) { return a * b / gcd(a, b); }
int two(int n) {
  ll ans = 1;
  rep(i, n) { ans *= 2; }
  return ans;
}
int fun(ll a, int b) {
  int ans = 0;
  while (1) {
    ans++;
    int c = a % b;
    if (c == 0) {
      break;
    } else {
      bitset<2 * 100000> s(c);
      int su = 0;
      rep(i, 100) {
        if (s.test(i))
          su++;
      }
      a = c;
      b = su;
    }
  }
  return ans;
}
int main() {
  cin.tie(0);
  cout.tie(0);
  ios::sync_with_stdio(false);
  int n;
  cin >> n;

  bitset<2 * 100000 + 1> s;
  cin >> s;
  int ho = 0;
  rep(i, n) {
    if (s.test(i))
      ho++;
  }
  int hom = ho - 1;
  int hop = ho + 1;
  vector<int> Hom(n, 0);
  vector<int> Hop(n);
  if (hom != 0) {
    rep(i, n) {
      if (i == 0) {
        Hom[i] = 1 % hom;
        Hop[i] = 1 % hop;
      } else {
        Hom[i] = Hom[i - 1] * 2 % hom;
        Hop[i] = Hop[i - 1] * 2 % hop;
      }
    }
  } else {
    rep(i, n) {
      if (i == 0) {
        Hop[i] = 1 % hop;
      } else {

        Hop[i] = Hop[i - 1] * 2 % hop;
      }
    }
  }
  if (hom != 0) {
    ll msum = 0;
    ll psum = 0;
    rep(i, n) {
      if (s.test(i)) {
        msum += Hom[i];
        psum += Hop[i];
      };
    }
    rep(i, n) {
      ll hoho;
      if (s.test(n - 1 - i)) {
        hoho = msum - Hom[n - 1 - i];
        cout << fun(hoho, hom) << endl;
      } else {
        hoho = psum + Hop[n - 1 - i];
        cout << fun(hoho, hop) << endl;
      }
    }
  } else {
    ll msum = 0;
    ll psum = 0;
    rep(i, n) {
      if (s.test(i)) {
        msum += Hom[i];
        psum += Hop[i];
      };
    }
    rep(i, n) {
      ll hoho;
      if (s.test(n - 1 - i)) {
        cout << 0 << endl;
      } else {
        hoho = psum + Hop[n - 1 - i];
        cout << fun(hoho, hop) << endl;
      }
    }
  }
  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
using ll = long long;
using P = pair<ll, ll>;
// マクロ
// forループ関係
// 引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
// Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define FOR(i, a, b) for (ll i = a; i <= (ll)(b); i++)
// xにはvectorなどのコンテナ
#define ALL(x) (x).begin(), (x).end() // sortなどの引数を省略したい
#define SIZE(x) ((ll)(x).size())      // sizeをsize_tからllに直しておく
#define MAX(x) *max_element(ALL(x))   // 最大値を求める
#define MIN(x) *min_element(ALL(x))   // 最小値を求める
// 定数
#define INF 1000000000000 // 10^12:極めて大きい値,∞
#define inf 2147483647    // int値の最大値
#define MOD 1000000007    // 10^9+7:合同式の法
#define MAXR 100000 // 10^5:配列の最大のrange(素数列挙などで使用)
// 略記
#define PB push_back                            // vectorヘの挿入
#define MP make_pair                            // pairのコンストラクタ
#define F first                                 // pairの一つ目の要素
#define S second                                // pairの二つ目の要素
#define CST(x) cout << fixed << setprecision(x) // 小数点以下の桁数指定
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
int gcd(int a, int b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
int lcm(int a, int b) { return a * b / gcd(a, b); }
int two(int n) {
  ll ans = 1;
  rep(i, n) { ans *= 2; }
  return ans;
}
int fun(int a, int b) {
  int ans = 0;
  while (1) {
    ans++;
    int c = a % b;
    if (c == 0) {
      break;
    } else {
      bitset<2 * 100000> s(c);
      int su = 0;
      rep(i, 30) {
        if (s.test(i))
          su++;
      }
      a = c;
      b = su;
    }
  }
  return ans;
}
int main() {
  cin.tie(0);
  cout.tie(0);
  ios::sync_with_stdio(false);
  int n;
  cin >> n;
  bitset<2 * 100000> s;
  cin >> s;
  int ho = 0;
  rep(i, n) {
    if (s.test(i))
      ho++;
  }
  int hom = ho - 1;
  int hop = ho + 1;
  vector<int> Hom(n, 0);
  vector<int> Hop(n);
  if (hom != 0) {
    rep(i, n) {
      if (i == 0) {
        Hom[i] = 1 % hom;
        Hop[i] = 1 % hop;
      } else {
        Hom[i] = Hom[i - 1] * 2 % hom;
        Hop[i] = Hop[i - 1] * 2 % hop;
      }
    }
  } else {
    rep(i, n) {
      if (i == 0) {
        Hop[i] = 1 % hop;
      } else {

        Hop[i] = Hop[i - 1] * 2 % hop;
      }
    }
  }

  ll msum = 0;
  ll psum = 0;
  rep(i, n) {
    if (s.test(i)) {
      msum += Hom[i];
      psum += Hop[i];
    };
  }
  rep(i, n) {
    int hoho;
    if (s.test(n - 1 - i)) {
      hoho = msum - Hom[n - 1 - i];
      cout << fun(hoho, hom) << endl;
    } else {
      hoho = psum + Hop[n - 1 - i];
      cout << fun(hoho, hop) << endl;
    }
  }
  return 0;
}