Problem p02900 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
typedef long long ll;
#define db double
#define ui unsigned int
#define ll long long
#define ull unsiged ll
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define per(i, r, l) for (int i = r; i >= l; i--)
#define pb push_back
#define pp pop_back
#define pii pair<int, int>
#define pll pair<ll, ll>
#define mod 1e9 + 7
#define vii vector<int>
#define vll vector<ll>
#define vpp vector<pii>
#define inf INT_MAX
#define lnf LLONG_MAX
#define mii map<int, int>
#define mll map<ll, ll>
#define mil map<int, ll>
#define umii unordered_map<int, int>
#define umll unordered_map<ll, ll>
#define si(n) scanf("%d", &n)
#define sl(n) scanf("%lld", &n)
#define boots                                                                  \
  ios::sync_with_stdio(0);                                                     \
  cin.tie(0);
#define endl '\n'
using namespace std;
const int MX = 1e6 + 7;
ll modulo(ll num, ll MOD = mod) { return ((num % MOD) + MOD) % MOD; }
ll power(ll b, ll e, ll MOD = mod) {
  ll ans = 1;
  while (e) {
    if (e % 2)
      ans = (ans * b) % MOD;
    b = (b * b) % MOD;
    e /= 2;
  }
  return ans;
}
ll inv(ll num, ll MOD = mod) { return power(modulo(num), MOD - 2, MOD); }
ll gcd(ll a, ll b) { return ((b == 0) ? a : gcd(b, a % b)); }
int top;
ll pri[MX];
int ji[MX];
void prime() {
  for (int i = 2; i < MX; i++) {
    if (!ji[i])
      pri[++top] = i;
    for (int j = 2; j * i < MX; j++) {
      ji[j * i] = 1;
    }
  }
}
int main() {
  boots;
  prime();
  ll a, b;
  cin >> a >> b;
  ll sum = 1;
  ll ans = max(a, b);
  ll ant = sqrt(ans);
  for (int i = 1; pri[i] <= a && pri[i] <= b; i++) {
    if (a % pri[i] == 0 && b % pri[i] == 0) {
      sum++;
    }
    if (a % pri[i] == 0) {
      while (a % pri[i] == 0) {
        a /= pri[i];
      }
    }
    if (b % pri[i] == 0) {
      while (b % pri[i] == 0) {
        b /= pri[i];
      }
    }
  }
  if (a > 1 && b > 1 && a == b)
    sum++;
  cout << sum << endl;
}


Fixed submission:
#include <bits/stdc++.h>
typedef long long ll;
#define db double
#define ui unsigned int
#define ll long long
#define ull unsiged ll
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define per(i, r, l) for (int i = r; i >= l; i--)
#define pb push_back
#define pp pop_back
#define pii pair<int, int>
#define pll pair<ll, ll>
#define mod 1e9 + 7
#define vii vector<int>
#define vll vector<ll>
#define vpp vector<pii>
#define inf INT_MAX
#define lnf LLONG_MAX
#define mii map<int, int>
#define mll map<ll, ll>
#define mil map<int, ll>
#define umii unordered_map<int, int>
#define umll unordered_map<ll, ll>
#define si(n) scanf("%d", &n)
#define sl(n) scanf("%lld", &n)
#define boots                                                                  \
  ios::sync_with_stdio(0);                                                     \
  cin.tie(0);
#define endl '\n'
using namespace std;
const int MX = 1e6 + 7;
ll modulo(ll num, ll MOD = mod) { return ((num % MOD) + MOD) % MOD; }
ll power(ll b, ll e, ll MOD = mod) {
  ll ans = 1;
  while (e) {
    if (e % 2)
      ans = (ans * b) % MOD;
    b = (b * b) % MOD;
    e /= 2;
  }
  return ans;
}
ll inv(ll num, ll MOD = mod) { return power(modulo(num), MOD - 2, MOD); }
ll gcd(ll a, ll b) { return ((b == 0) ? a : gcd(b, a % b)); }
int top;
ll pri[MX];
int ji[MX];
void prime() {
  for (int i = 2; i < MX; i++) {
    if (!ji[i])
      pri[++top] = i;
    for (int j = 2; j * i < MX; j++) {
      ji[j * i] = 1;
    }
  }
}
int main() {
  boots;
  prime();
  ll a, b;
  cin >> a >> b;
  ll sum = 1;
  ll ans = max(a, b);
  ll ant = sqrt(ans);
  for (int i = 1; pri[i] <= ant; i++) {
    if (!a || !b)
      break;
    if (a % pri[i] == 0 && b % pri[i] == 0) {
      sum++;
    }
    if (a % pri[i] == 0) {
      while (a % pri[i] == 0) {
        a /= pri[i];
      }
    }
    if (b % pri[i] == 0) {
      while (b % pri[i] == 0) {
        b /= pri[i];
      }
    }
  }
  if (a > 1 && b > 1 && a == b)
    sum++;
  cout << sum << endl;
}