#include <bits/stdc++.h>
#include <boost/multiprecision/cpp_int.hpp>
using namespace std;
using bint = boost::multiprecision::cpp_int;
using ll = long long;
using pint = pair<int, int>;
using pll = pair<ll, ll>;
#define rep(i,n) for (int i = 0; i < (n); i++)
#define repSE(i,s,n) for (int i = (s); i < (n); i++)
#define rrepSE(i,s,e) for (int i = (s); i > (e); i--)
#define ssort(v) sort(v.begin(), v.end())
#define gsort(v) sort(v.rbegin(), v.rend())
template<typename T> istream &operator>>(istream &is, vector<T> &vec){ for (auto &v : vec) is >> v; return is; }
template<typename T> ostream &operator<<(ostream &os, const vector<T> &vec){ os << "["; for (auto v : vec) os << v << ","; os << "]"; return os; }
template<typename T> ostream &operator<<(ostream &os, const deque<T> &vec){ os << "deq["; for (auto v : vec) os << v << ","; os << "]"; return os; }
template<typename T> ostream &operator<<(ostream &os, const set<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T> ostream &operator<<(ostream &os, const unordered_set<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T> ostream &operator<<(ostream &os, const multiset<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T> ostream &operator<<(ostream &os, const unordered_multiset<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T1, typename T2> ostream &operator<<(ostream &os, const pair<T1, T2> &pa){ os << "(" << pa.first << "," << pa.second << ")"; return os; }
template<typename TK, typename TV> ostream &operator<<(ostream &os, const map<TK, TV> &mp){ os << "{"; for (auto v : mp) os << v.first << "=>" << v.second << ","; os << "}"; return os; }
template<typename TK, typename TV> ostream &operator<<(ostream &os, const unordered_map<TK, TV> &mp){ os << "{"; for (auto v : mp) os << v.first << "=>" << v.second << ","; os << "}"; return os; }
template<typename T> bool chmax(T &m, const T q) { if (m < q) {m = q; return true;} else return false; }
template<typename T> bool chmin(T &m, const T q) { if (q < m) {m = q; return true;} else return false; }
#define DEBUG_PRINT(var) std::cout << #var << " = " << var << "\n";

int main()
{
    ll a, b;
    cin >> a >> b;
    map<ll,int> ad, bd;
    ll na = a, nb = b;
    for (ll i = 2; i*i <= a; i++) {
        while (na%i == 0) {
            ad[i]++;
            na /= i;
        }
    }
    if (na > 1) ad[na] ++;
    for (ll i = 2; i*i <= b; i++) {
        while (nb%i == 0) {
            bd[i]++;
            nb /= i;
        }
    }
    if (nb > 1) bd[nb] ++;
    ll ans = 1;
    for (auto ea : ad) {
        if (bd[ea.first] > 0) ans++;
    }
    cout << ans << "\n";
    return 0;
}

#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define ll long long
ll gcd(ll a,ll b){
  while(b>0){
    ll r=a%b;
    a=b;
    b=r;
  }
  return a;
}   
int main(){
  ll a,b;
  cin >> a >> b;
  ll p=gcd(a,b);
  ll i;
  ll cp=p;
  vector<ll> ans(2000);
  ans.at(0)=1;
  ll j=1;
  for(i=2;i*i<=p;i++){
    bool is=false;
    while(cp%i==0){
      cp/=i;
      is=true;
    }
    if(is){
      ans.at(j)=i;
      j++;
    }
  }
  if(cp!=1){
    ans.at(j)=cp;
  }
  rep(i,2000){
    if(ans.at(i)==0){
      break;
    }
    
  }
  rep(i,2000){
    if(ans.at(i)==0){
      cout << i;
      return 0;
    }
  }
}