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

template<typename T>
bool is_prime(T x) {
	if (x == 1) {
		return false;
	}
	for (int i = 2; (T) i * i <= x; i++) {
		if (x % i == 0) {
			return false;
		}
	}
	return true;
}

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

	long long a, b;
	cin >> a >> b;

	int len = b - a + 1;

	vector<int> p;
	for (int i = 1; i <= len; i++) {
		if (is_prime(i)) {
			p.push_back(i);
		}
	}

	vector<int> mask_of(len);
	for (long long x = a; x <= b; x++) {
		for (int i = 0; i < int(p.size()); i++) {
			if (x % p[i] == 0) {
				mask_of[x - a] |= (1 << i);
			}
		}
	}

	vector<long long> dp(1 << p.size());
	dp[0] = 1;

	for (int i = 0; i < len; i++) {
		for (int mask = (1 << int(p.size())) - 1; mask >= 0; mask--) {
			if ((mask & mask_of[i]) == 0) {
				dp[mask | mask_of[i]] += dp[mask];
			}
		}
	}
	cout << accumulate(dp.begin(), dp.end(), 0ll) << '\n';
	return 0;
}
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define fi first
#define se second
#define pb push_back
#define wzh(x) cerr<<#x<<'='<<x<<endl;
LL a,b;
int g[22],d[22];
int _v,_w;
LL gcd(LL x,LL y){
  return y==0?x:gcd(y,x%y);
}
int ban_v[1<<22];
int sum_v[1<<22];
vector<LL>G;
LL ans;
void gao(vector<LL>&v,vector<LL>&w){
  while(v.size()>w.size()){
    w.pb(v.back());
    v.pop_back();
  }
  _v=v.size(),_w=w.size();
  memset(ban_v,0,sizeof ban_v);
  memset(sum_v,0,sizeof sum_v);
  memset(g,0,sizeof g);
  memset(d,0,sizeof d);
  for(int i=0;i<_v;i++){
    for(int j=0;j<_v;j++){
      if(i==j)continue;
      if(gcd(v[i],v[j])!=1){
        g[i]|=1<<j;
      }
    }
  }
  for(int i=0;i<_w;i++){
    for(int j=0;j<_w;j++){
      if(i==j)continue;
      if(gcd(w[i],w[j])!=1){
        d[i]|=1<<j;
      }
    }
    for(int j=0;j<_v;j++){
      if(gcd(w[i],v[j])!=1){
        ban_v[i]|=1<<j;
      }
    }
  }
  for(int i=0;i<1<<_v;i++){
    int st=0;
    for(int j=0;j<_v;j++){
      if(1<<j&i){
        if(( g[j]) & (i^(1<<j)))st=1;
      }
    }
    if(!st) {
      sum_v[i] = 1;
    }
  }

  for(int i=0;i<_v;i++){
    for(int j=0;j<1<<_v;j++){
      if(1<<i&j)sum_v[j]+=sum_v[j^(1<<i)];
    }
  }
  int sum_sta=1<<_v ;
  sum_sta--;
  for(int i=0;i<1<<_w;i++){
    int st=0;
    int sum_ban=0;
    for(int j=0;j<_w;j++){
      if(1<<j&i){
        if(( d[j]) & (i))st=1;
        sum_ban|=ban_v[j];
      }
    }
    if(!st){
      assert((sum_ban&sum_sta)==sum_ban);
      //cout<<i<<' '<<(sum_ban^sum_sta)<<'\n';
      ans+=sum_v[sum_ban^sum_sta];
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin>>a>>b;vector<LL>v,w;
  for(LL i=a;i<=b;i++){
    if(i&1)v.pb(i);
    else G.pb(i);
  }
  G.pb(1);
  /*
   * 因为偶数只能选一个
   * 枚举不选 或者 选哪个 偶数
   * 存一下跟这个偶数gcd为1的奇数
   *
   * meet in middle 来计算 奇数部分的答案。
   * */
  for(auto k:G){
    v.clear();w.clear();
    for(LL i=a;i<=b;i++){
      if(i%2==0)continue;
      if(gcd(k,i)==1)v.pb(i);
    }
    //cout<<"ev-> "<<k<<'\n';
   // cout<<"od->\n";
   //for(auto x:v)cout<<x<<' ';cout<<'\n';
    gao(v,w);
  }
  cout<<ans<<'\n';
  return 0;
}
//2125824
//4589568