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

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

typedef long long lli;

const lli M = 60;
const lli S = 60;
lli H, h, m, s;

/*
  (?§???????degree)
  ?§?????§???? = 6s
  ???????§???? = 1/10 * (60m + s)
  ???????§???? = 1/(10H) * (3600h + 60m + s)

  ???????§???? - ?§?????§???? == ?§?????§???? - ???????§???? ?????????
  s = (3600h + (1+H)60m) / (119H - 1)
  ?????£???????????????119H-1 ??

  ?????°???????????????????????¢????????????????????§???????????§???????????????????????????????????£??¨?????????????????£???????°?????????????
 */

bool is_same_deg(const lli &sa, const lli &sb) {
  // s??§??????sa????????§????????????sb??????????????????
  // ?????°?????????????????????10*H??????????????????
  lli h_s = 3600 * h * sb + 60 * m * sb + sa - 60 * H * sa;
  lli s_m = 60 * H * sa - 60 * H * m * sb - H * sa;

  // ?§??????\\?????????????????????????§?????????????
  for (lli i = 0; i <= 1; i++) {
    for (lli j = 0; j <= 1; j++) {
      if (h_s + 360 * 10 * H * sb * i == s_m + 360 * 10 * H * sb * j)
        return true;
    }
  }
  return false;
}

bool is_overlap(const lli &sa, const lli &sb) {
  lli h_deg_mul10h = 3600 * h * sb + 60 * m * sb + sa;
  lli s_deg = 6 * sa;
  lli m_deg_mul10 = 60 * m * sb + sa;
  return (s_deg * 10 * H == h_deg_mul10h || s_deg * 10 == m_deg_mul10);
}

void solve() {
  lli sa, sb = 119 * H - 1;
  sa = s * sb;
  // 1 / (119H-1) ?§??????????????????¨??¢?´¢
  for (int i = 0; i <= H * M * S * sb; i++) {
    if (is_same_deg(sa, sb) && !is_overlap(sa, sb)) {
      lli g = __gcd(sa, sb);
      cout << h << ' ' << m << ' ' << sa / g << ' ' << sb / g << endl;
      return;
    }

    // failed
    sa++;
    if (sa >= S * sb) {
      sa -= S * sb;
      m++;
      if (m >= M) {
        m -= M;
        h++;
        if (h >= H) {
          h = m = sa = 0;
        }
      }
    }
  }

  cout << -1 << endl;
}

int main() {
  while (cin >> H >> h >> m >> s && (H | h | m | s))
    solve();
}

Error: 0

Fixed submission:

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

const int M = 60;
const int S = 60;
int H, h, m, s;

/*
  (?§???????degree)
  ?§?????§???? = 6s
  ???????§???? = 1/10 * (60m + s)
  ???????§???? = 1/(10H) * (3600h + 60m + s)

  ???????§???? - ?§?????§???? == ?§?????§???? - ???????§???? ?????????
  s = (3600h + (1+H)60m) / (119H - 1)
  ?????£???????????????119H-1 ??

  ?????°???????????????????????¢????????????????????§???????????§???????????????????????????????????£??¨?????????????????£???????°?????????????
 */

bool is_same_deg(const int &sa, const int &sb) {
  // s??§??????sa????????§????????????sb??????????????????
  int h_s = 3600 * h * sb + 60 * m * sb + sa -
            60 * H * sa; //?????°?????????????????????10*H??????????????????
  int s_m = 60 * H * sa - 60 * H * m * sb -
            H * sa; //?????°?????????????????????10*H??????????????????
  for (int i = 0; i <= 1; i++) {
    for (int j = 0; j <= 1; j++) {
      if (h_s + 360 * 10 * H * sb * i == s_m + 360 * 10 * H * sb * j)
        return true;
    }
  }
  return false;
}

bool is_overlap(const int &sa, const int &sb) {
  int h_deg_mul10h = 3600 * h * sb + 60 * m * sb + sa;
  int s_deg = 6 * h * sb;
  int m_deg_mul10 = 60 * m * sb + sa;
  return (s_deg * 10 * H == h_deg_mul10h || s_deg * 10 == m_deg_mul10);
}

void solve() {
  int sa, sb = 119 * H - 1;
  sa = s * sb;
  // 1 / (119H-1) ?§??????????????????¨??¢?´¢
  for (int i = 0; i <= H * M * S * sb; i++) {
    if (is_same_deg(sa, sb) && !is_overlap(sa, sb)) {
      int g = __gcd(sa, sb);
      cout << h << ' ' << m << ' ' << sa / g << ' ' << sb / g << endl;
      return;
    }

    // failed
    sa++;
    if (sa >= S * sb) {
      sa -= S * sb;
      m++;
      if (m >= M) {
        m -= M;
        h++;
        if (h >= H) {
          h = m = sa = 0;
        }
      }
    }
  }

  cout << -1 << endl;
  assert(false);
}

int main() {
  while (cin >> H >> h >> m >> s && (H | h | m | s))
    solve();
}