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

ll u(ll a, ll b){
	if(a%b==0) return b;
	
	else return u(b,a%b);
	
	
}

//素数判別じゃなかったです
//ll s( ll n){
//	bool k[n+1]={};
//	ll ans=0;
//	for(ll i=2; i<n; i++){
//		if(!k[i]){
//			ll d=i;
//			if(n%i==0){
//				ans++;
//				cout<<i<<endl;
//			}
//			//cout<<i<<" "<<ans<<endl;
//			while(d<=n){
//				k[d]=true;
//				d+=i;
//			}
//		}
//		///cout<<ans<<endl;
//	}
//	//cout<<ans<<endl;
//	return ans;
//}
		


int main(){
	ll n,a,b;
	cin>>a>>b;
	n=u( max(a,b),min(a,b));
	//cout<<n<<endl;
	ll ans=1;
	ll k=2;
	//ans+=s(n);
	//ルートn以上の素因数は１コまで
	while(n>=k*k){
		if(n%k==0) ans++;
		
		
		while(n%k==0){
			n/=k;
		}
		//cout<<n<<endl;
		k++;
	}
	if(n>1){
		ans++;
	}
	//cout<<n<<endl;
	cout<< ans <<endl;
}
#include<bits/stdc++.h>
#define rep(i,f,n) for(ll i=(f); (i) < (n); i++)
#define repe(i,f,n) for(ll i=(f); (i) <= (n); i++)
using namespace std;
using ll = long long;
#define MOD (ll)1000000007
#define PI 3.14159265359
#define debug(x) cout<<#x<<" :: "<<x<<"\n";
#define debug2(x,y) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\n";
#define debug3(x,y,z) cout<<#x<<" :: "<<x<<"\t"<<#y<<" :: "<<y<<"\t"<<#z<<" :: "<<z<<"\n";
//#define P pair<ll, ll>
//printf("%.10f\n")
//cout << fixed << setprecision(10);
template<class T> inline bool chmax(T& a, T b){if (a < b) { a = b; return true; } return false;}
template<class T> inline bool chmin(T& a, T b){if (a > b) { a = b; return true; } return false;}
ll INF = 1e+18;
int iINF = 1e9;

int
main()
{

  int N, M; cin >> N >> M;
  if(M % N == 0){
    cout << M / N << endl;
    return 0;
  }
  int maxi = 1;
  rep(i, 1, M/N){
    int d = i;
    if((M - (d * (N - 1))) % d == 0) maxi = i;
  }

  cout << maxi << endl;

}


