/*
TASK:rprimes
LANG:C++
*/
#include <iostream>
#include <cstdlib>
#include <cmath>
typedef unsigned long long ull;
bool A[33554432];
const int Y[] = {1,3,7,9};
const int y[] = {2,3,5,7};
using namespace std;
int min(ull T, ull R)
{
	return (T>R)?R:T;
}

int a,b;
bool r;
ull R;
int S;
int limit;

int eratosten(int b)
{
 for(ull i=2; i<=sqrt(b); i++)
 {
         for(ull j=2; i*j<=b; j++)
         {
                 A[i*j]=1;
         }
 }
 return 1;
}

int checkP(ull Y)
{
    for(ull t=2; t<=int(sqrt(b)); t++)
    {
            if(!A[t]){
            if(Y%t==0) return 1;
            }
    }
    return 0;
}

int backtrack(int i)
{
    if(i==0)
    {
            for(int j=0; j<4; j++)
            {
                    R=y[j];
					if(a<=y[j]) S++;
                    backtrack(R);
                    R-=y[j];
            }
    }
    else
    {
        if(R>b) return 0;
        for(int j=0; j<4; j++)
        {
                if(10*R+Y[j]<limit)
                {
                                    if(!A[10*R+Y[j]])
                                    {
                                                     R=10*R+Y[j];
                                                     if(backtrack(i+1)) {S++;} //cout<<R; system("PAUSE");}
                                                     R = R/10;
                                    }
                }
                else
                {
                    if(!checkP(10*R+Y[j]))
                    {
                                          R=10*R+Y[j];
                                          if(backtrack(i+1)) {S++;}//cout<<R; system("PAUSE");}
                                          R=R/10;
                    }
                }
        }
    }
    return (R>=a&&R<=b)?1:0;
}

int main()
{
    cin>>a>>b;
    eratosten(min(b, 33554431));
    limit = min(b, 33554431);
    backtrack(0);
    cout<<S;
    return 0;
}
