#include <cstdio>
const int maxn=100+10;
struct E{
	int to;
	int next;
}ed[maxn*maxn*2];
int head[maxn];
int tot;
void J(int a,int b){
	ed[++tot].to=b;
	ed[tot].next=head[a];
	head[a]=tot;
}
int en;
int vis[maxn];
int ans;
void Dfs(int x){
	if(x==en+1){
		ans++;
		return;
	}
	if(!head[x]){
		Dfs(x+1);
		return;
	}
	for(int i=head[x];i;i=ed[i].next){
		if(vis[ed[i].to]){
			Dfs(x+1);
			return;
		}
	}
	Dfs(x+1);
	vis[x]=1;
	Dfs(x+1);
	vis[x]=0;
}
long long gcd(long long a,long long b){
	return b?gcd(b,a%b):a;
}
int main(){
	long long a,b;
	scanf("%lld%lld",&a,&b);
	en=b-a+1;
	for(int i=1;i<=b-a+1;i++)
		for(int j=1;j<=b-a+1;j++){
			if(i==j)
				continue;
			if(gcd(a+i-1,a+j-1)!=1){
				J(i,j);
				J(j,i);
			}
		}
	Dfs(1);
	int ha=0;
	for(int i=1;i<=b-a+1;i++)
		if(!head[i])
			ha++;
	printf("%lld",1ll*ans*(1ll<<ha));
	return 0;
}
#include <bits/stdc++.h>

using namespace std;

#define int long long
int const MAXN = 1 << 21;
int n, m, T;
int p[30], cnt;
int dp[MAXN];
void init() {
    for (int i = 2; i < 72; i++) {
        int f = 1;
        for (int j = 2; j * j <= i; j++) {
            if (i % j == 0) {
                f = 0;
                break;
            }
        }
        if (f) p[cnt++] = i;
    }
}
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int A, B;
    cin >> A >> B;
    init();
    dp[0] = 1;
    for (int x = A; x <= B; x++) {
        int bit = 0;
        for (int i = 0; i < cnt; i++)
            if (x % p[i] == 0) bit |= (1 << i);
        for (int i = 0; i < (1 << cnt); i++)
            if (!(bit & i)) {
                dp[bit | i] += dp[i];
            }
    }
    int ans = 0;
    for (int i = 0; i < (1 << cnt); i++) ans += dp[i];
    cout << ans;
    return 0;
}