Problem p02900 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;

#define st first
#define nd second
#define pb push_back

typedef long long ll;
typedef double db;
typedef long double ldb;

typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ll, db> pdb;
typedef pair<ldb, ldb> pldb;

template <typename T> void Debug(T begin, T end);
int si();
ll sl();
string ss(int);
db sf();
ldb slf();
void pi(int, char = '\n');
void pl(ll, char = '\n');
void pf(db, char = '\n');
void plf(ldb, char = '\n');
void ps(string, char = '\n');

ll russian(ll, ll, ll);
ll fast_power(ll, ll, ll);
ll slow_power(ll, ll, ll);
ll _gcd(ll, ll);
ll _lcm(ll, ll);

const int INF = 1e9;
const ll LINF = 1e18;

int main() {
  ll a = sl(), b = sl();
  ll gcd = _gcd(a, b);

  int result = 1;
  for (int i = 2; i * i <= gcd; ++i) {
    if (gcd % i == 0) {
      ++result;
      while (gcd % i == 0)
        gcd /= i;
    }
  }
  pi(result + (gcd == 1 ? 0 : 1));

  return 0;
}

template <typename T> void Debug(T begin, T end) {
  printf("\nDEBUG:\n");
  while (begin != end)
    printf("%d ", *begin), begin++;
  printf("\n\n");
}

template <typename T> T scanf_t(string s) {
  T a;
  scanf(s.c_str(), &a);
  return a;
}

template <typename T> void printf_t(T a, string s, char end_l) {
  s.push_back(end_l);
  printf(s.c_str(), a);
}

int si() { return scanf_t<int>("%d"); }
ll sl() { return scanf_t<ll>("%lld"); }
db sf() { return scanf_t<db>("%f"); }
ldb slf() { return scanf_t<ldb>("%Lf"); }

void pi(int a, char end_l) { printf_t<int>(a, "%d", end_l); }
void pl(ll a, char end_l) { printf_t<ll>(a, "%lld", end_l); }
void pf(db a, char end_l) { printf_t<db>(a, "%lf", end_l); }
void plf(ldb a, char end_l) { printf_t<ldb>(a, "%Lf", end_l); }

void ps(string a, char end_l) {
  string s = "%s";
  s.push_back(end_l);
  printf(s.c_str(), a.c_str());
}

string ss(int NN) {
  char T[NN];
  scanf("%s", T);
  return (string)T;
}

ll fast_power(ll a, ll k, ll m) {
  ll r = 1LL;
  while (k) {
    if (k & 1LL)
      r = (r * a) % m;
    a = (a * a) % m;
    k >>= 1LL;
  }
  return r;
}

ll slow_power(ll a, ll k, ll m) {
  ll r = 1LL;
  while (k) {
    if (k & 1LL)
      r = russian(r, a, m);
    a = russian(a, a, m);
    k >>= 1LL;
  }
  return r;
}

ll russian(ll a, ll k, ll m) {
  ll r = 0LL;
  while (k) {
    if (k & 1LL)
      r = (r + a) % m;
    a = (a + a) % m;
    k >>= 1LL;
  }
  return r;
}

ll _gcd(ll a, ll b) {
  while (b)
    swap(a %= b, b);
  return a;
}

ll _lcm(ll a, ll b) { return a / _gcd(a, b) * b; }


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

#define st first
#define nd second
#define pb push_back

typedef long long ll;
typedef double db;
typedef long double ldb;

typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ll, db> pdb;
typedef pair<ldb, ldb> pldb;

template <typename T> void Debug(T begin, T end);
int si();
ll sl();
string ss(int);
db sf();
ldb slf();
void pi(int, char = '\n');
void pl(ll, char = '\n');
void pf(db, char = '\n');
void plf(ldb, char = '\n');
void ps(string, char = '\n');

ll russian(ll, ll, ll);
ll fast_power(ll, ll, ll);
ll slow_power(ll, ll, ll);
ll _gcd(ll, ll);
ll _lcm(ll, ll);

const int INF = 1e9;
const ll LINF = 1e18;

int main() {
  ll a = sl(), b = sl();
  ll gcd = _gcd(a, b);

  int result = 1;
  for (ll i = 2; i * i <= gcd; ++i) {
    if (gcd % i == 0) {
      ++result;
      while (gcd % i == 0)
        gcd /= i;
    }
  }
  pi(result + (gcd == 1 ? 0 : 1));

  return 0;
}

template <typename T> void Debug(T begin, T end) {
  printf("\nDEBUG:\n");
  while (begin != end)
    printf("%d ", *begin), begin++;
  printf("\n\n");
}

template <typename T> T scanf_t(string s) {
  T a;
  scanf(s.c_str(), &a);
  return a;
}

template <typename T> void printf_t(T a, string s, char end_l) {
  s.push_back(end_l);
  printf(s.c_str(), a);
}

int si() { return scanf_t<int>("%d"); }
ll sl() { return scanf_t<ll>("%lld"); }
db sf() { return scanf_t<db>("%f"); }
ldb slf() { return scanf_t<ldb>("%Lf"); }

void pi(int a, char end_l) { printf_t<int>(a, "%d", end_l); }
void pl(ll a, char end_l) { printf_t<ll>(a, "%lld", end_l); }
void pf(db a, char end_l) { printf_t<db>(a, "%lf", end_l); }
void plf(ldb a, char end_l) { printf_t<ldb>(a, "%Lf", end_l); }

void ps(string a, char end_l) {
  string s = "%s";
  s.push_back(end_l);
  printf(s.c_str(), a.c_str());
}

string ss(int NN) {
  char T[NN];
  scanf("%s", T);
  return (string)T;
}

ll fast_power(ll a, ll k, ll m) {
  ll r = 1LL;
  while (k) {
    if (k & 1LL)
      r = (r * a) % m;
    a = (a * a) % m;
    k >>= 1LL;
  }
  return r;
}

ll slow_power(ll a, ll k, ll m) {
  ll r = 1LL;
  while (k) {
    if (k & 1LL)
      r = russian(r, a, m);
    a = russian(a, a, m);
    k >>= 1LL;
  }
  return r;
}

ll russian(ll a, ll k, ll m) {
  ll r = 0LL;
  while (k) {
    if (k & 1LL)
      r = (r + a) % m;
    a = (a + a) % m;
    k >>= 1LL;
  }
  return r;
}

ll _gcd(ll a, ll b) {
  while (b)
    swap(a %= b, b);
  return a;
}

ll _lcm(ll a, ll b) { return a / _gcd(a, b) * b; }