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

#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <chrono>
#include <cmath>
#include <cstdio>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;

#define forn(a, e) for (int a = 0; a < (int)(e); a++)
#define forr(a, s, e) for (int a = s; a < (int)(e); a++)
#define fore(e, a) for (auto &e : a)

#ifdef LOCAL
#define logv(a)                                                                \\
  {                                                                            \\
    cerr << #a << " = ";                                                       \\
    fore(e, a) { cerr << e << " "; }                                           \\
    cerr << "\\n";                                                              \\
  }
#define logvp(a)                                                               \\
  {                                                                            \\
    cerr << #a << " = ";                                                       \\
    fore(e, a) { cerr << "(" << e.first << ", " << e.second << ") "; }         \\
    cerr << "\\n";                                                              \\
  }
#define logvv(a)                                                               \\
  {                                                                            \\
    cerr << #a << " = \\n";                                                     \\
    fore(r, a) {                                                               \\
      fore(e, r) { cerr << e << " "; }                                         \\
      cerr << "\\n";                                                            \\
    }                                                                          \\
  }
#define logvf(a, field)                                                        \\
  {                                                                            \\
    cerr << #a "." #field << " = \\n";                                          \\
    fore(e, a) { cerr << e.field << " "; }                                     \\
    cerr << "\\n";                                                              \\
  }
#define logvff(a, f1, f2)                                                      \\
  {                                                                            \\
    cerr << #a ".{" #f1 << ", " #f2 << "} = \\n";                               \\
    fore(e, a) { cerr << "(" << e.f1 << ", " << e.f2 << ") "; }                \\
    cerr << "\\n";                                                              \\
  }
#define logs(a) cerr << #a << " = " << (a) << "\\n";
#define logss(a, b)                                                            \\
  cerr << #a << " = " << (a) << ", " << #b << " = " << (b) << "\\n";
#define logp(a)                                                                \\
  cerr << #a << " = "                                                          \\
       << "(" << a.first << ", " << a.second << ")"                            \\
       << "\\n";
#define cond(pred, stmt)                                                       \\
  if (pred) {                                                                  \\
    stmt                                                                       \\
  }
#else
#define logv(a)
#define logvp(a)
#define logvv(a)
#define logvf(a, field)
#define logvff(a, f1, f2)
#define logs(a)
#define logss(a, b)
#define logp(a)
#define cond(pred, stmt)
#endif

using i64 = long long;
using iip = pair<i64, i64>;
using ivec = vector<int>;
using llvec = vector<i64>;
using svec = vector<string>;
template <typename T> using vec = vector<T>;

template <typename T, typename Dim> auto make_vec(T value, Dim dim) {
  return vector<T>(dim, value);
}
template <typename T, typename Dim1, typename... Dim>
auto make_vec(T value, Dim1 dim1, Dim... dims) {
  return make_vec(make_vec(value, dims...), dim1);
}

template <typename T> bool uax(T &v, const T &newv) {
  if (v < newv) {
    v = newv;
    return true;
  } else
    return false;
}
template <typename T> bool uin(T &v, const T &newv) {
  if (v > newv) {
    v = newv;
    return true;
  } else
    return false;
}

template <typename U, typename V>
istream &operator>>(istream &is, pair<U, V> &p) {
  is >> p.first >> p.second;
  return is;
}
template <typename T> istream &operator>>(istream &is, vector<T> &c) {
  for (auto &e : c)
    is >> e;
  return is;
}

// template<typename ...T>
// istream& read(T&... args) { return (cin >> ... >> args); }

static mt19937 rande(123123);
template <typename T> T rand_int(T from, T to) {
  uniform_int_distribution<T> distr(from, to);
  return distr(rande);
}

bool valid(i64 n, i64 a) {
  i64 ap = a;
  forn(i, 60) {
    if (n % ap == 0 && ((n / ap) - 1) % a == 0) {
      return true;
    }
    if ((n) / ap < a) {
      break;
    }
    ap *= a;
    if (ap > n) {
      break;
    }
  }
  return false;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);

  i64 n;
  while (cin >> n) {

    if (n == 2) {
      cout << 1 << endl;
      continue;
    }
    i64 ans = 0;
    for (i64 i = 2; i * i <= n; i++) {
      if (n % i == 0) {
        ans += valid(n, i);
        if (i * i != n) {
          ans += valid(n, n / i);
        }
      }
    }
    ans++;

    for (i64 i = 2; i * i <= n - 1; i++) {
      if ((n - 1) % i == 0) {
        ans++;
        ans += (i * i != n - 1);
      }
    }

    ans++;

    cout << ans << endl;
  }
}


Error: 0

Fixed submission:

#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <chrono>
#include <cmath>
#include <cstdio>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;

#define forn(a, e) for (int a = 0; a < (int)(e); a++)
#define forr(a, s, e) for (int a = s; a < (int)(e); a++)
#define fore(e, a) for (auto &e : a)

#ifdef LOCAL
#define logv(a)                                                                \\
  {                                                                            \\
    cerr << #a << " = ";                                                       \\
    fore(e, a) { cerr << e << " "; }                                           \\
    cerr << "\\n";                                                              \\
  }
#define logvp(a)                                                               \\
  {                                                                            \\
    cerr << #a << " = ";                                                       \\
    fore(e, a) { cerr << "(" << e.first << ", " << e.second << ") "; }         \\
    cerr << "\\n";                                                              \\
  }
#define logvv(a)                                                               \\
  {                                                                            \\
    cerr << #a << " = \\n";                                                     \\
    fore(r, a) {                                                               \\
      fore(e, r) { cerr << e << " "; }                                         \\
      cerr << "\\n";                                                            \\
    }                                                                          \\
  }
#define logvf(a, field)                                                        \\
  {                                                                            \\
    cerr << #a "." #field << " = \\n";                                          \\
    fore(e, a) { cerr << e.field << " "; }                                     \\
    cerr << "\\n";                                                              \\
  }
#define logvff(a, f1, f2)                                                      \\
  {                                                                            \\
    cerr << #a ".{" #f1 << ", " #f2 << "} = \\n";                               \\
    fore(e, a) { cerr << "(" << e.f1 << ", " << e.f2 << ") "; }                \\
    cerr << "\\n";                                                              \\
  }
#define logs(a) cerr << #a << " = " << (a) << "\\n";
#define logss(a, b)                                                            \\
  cerr << #a << " = " << (a) << ", " << #b << " = " << (b) << "\\n";
#define logp(a)                                                                \\
  cerr << #a << " = "                                                          \\
       << "(" << a.first << ", " << a.second << ")"                            \\
       << "\\n";
#define cond(pred, stmt)                                                       \\
  if (pred) {                                                                  \\
    stmt                                                                       \\
  }
#else
#define logv(a)
#define logvp(a)
#define logvv(a)
#define logvf(a, field)
#define logvff(a, f1, f2)
#define logs(a)
#define logss(a, b)
#define logp(a)
#define cond(pred, stmt)
#endif

using i64 = long long;
using iip = pair<i64, i64>;
using ivec = vector<int>;
using llvec = vector<i64>;
using svec = vector<string>;
template <typename T> using vec = vector<T>;

template <typename T, typename Dim> auto make_vec(T value, Dim dim) {
  return vector<T>(dim, value);
}
template <typename T, typename Dim1, typename... Dim>
auto make_vec(T value, Dim1 dim1, Dim... dims) {
  return make_vec(make_vec(value, dims...), dim1);
}

template <typename T> bool uax(T &v, const T &newv) {
  if (v < newv) {
    v = newv;
    return true;
  } else
    return false;
}
template <typename T> bool uin(T &v, const T &newv) {
  if (v > newv) {
    v = newv;
    return true;
  } else
    return false;
}

template <typename U, typename V>
istream &operator>>(istream &is, pair<U, V> &p) {
  is >> p.first >> p.second;
  return is;
}
template <typename T> istream &operator>>(istream &is, vector<T> &c) {
  for (auto &e : c)
    is >> e;
  return is;
}

// template<typename ...T>
// istream& read(T&... args) { return (cin >> ... >> args); }

static mt19937 rande(123123);
template <typename T> T rand_int(T from, T to) {
  uniform_int_distribution<T> distr(from, to);
  return distr(rande);
}

bool valid(i64 n, i64 a) {
  i64 ap = a;
  forn(i, 60) {
    if (n % ap == 0 && ((n / ap) - 1) % a == 0) {
      return true;
    }
    ap *= a;
    if (ap > n) {
      break;
    }
  }
  return false;
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);

  i64 n;
  while (cin >> n) {
    i64 ans = 0;
    for (i64 i = 2; i * i <= n; i++) {
      if (n % i == 0) {
        ans += valid(n, i);
        if (i * i != n) {
          ans += valid(n, n / i);
        }
      }
    }
    ans++;

    for (i64 i = 2; i * i <= n - 1; i++) {
      if ((n - 1) % i == 0) {
        ans++;
        ans += (i * i != n - 1);
      }
    }

    ans++;

    cout << ans << endl;
  }
}