#include<bits/stdc++.h>
using namespace std;
#define all(v) v.begin(), v.end()
typedef unsigned long long int ulli;
typedef long long int ll;
vector<ulli> sieve(ulli n)
{
vector<bool> prime(n + 1, true);
prime[0] = false;
prime[1] = false;
long long int m = sqrt(n);
for (ulli p = 2; p <= m; p++) {
// If prime[p] is not changed, then it
// is a prime
if (prime[p]) {
// Update all multiples of p
for (ulli i = p * 2; i <= n; i += p)
prime[i] = false;
}
}
// push all the primes into the vector ans
vector<ulli> ans;
for (long long int i = 0; i < n; i++)
if (prime[i])
ans.push_back(i);
return ans;
}
vector<ulli> sieveRange(ulli start, ulli end)
{
// find primes from [0..end] range
vector<ulli> ans = sieve(end);
// Find index of first prime greater than or
// equal to start
// O(sqrt(n)loglog(n))
long long int lower_bound_index = lower_bound(all(ans), start) -
ans.begin();
// Remove all elements smaller than start.
// O(logn)
ans.erase(ans.begin(), ans.begin() + lower_bound_index);
return ans;
}
// Driver Program to test above function
int main()
{
long long int t,f,l,r;
vector<long long int> a(1000000, 0);
l=1;
r=600;
f=0;
map<int,int> a2;
r++;
ulli start = l;
ulli end = r;
vector<ulli> ans = sieveRange(start, end);
for (auto i : ans)
{ a[f]=i;
a2[i]++;
//cout<<a[f]<<"\n";
f++;
}
//cout<<a2[599];
ll l1,r1;
cin>>l1>>r1;
ll i;
i=l1;ll c=0;
while(i<=r1)
{
ll k=i;
ll s=0;
ll s1=0;
while(k!=0)
{
ll gf=k%10;
s=s+gf;
s1=s1+(gf*gf);
k=k/10;
}
if(a2[s]==1 && a2[s1]==1)
{
//cout<<i<<"\n";
c++;
}
i++;
}
cout<<c;
return 0;
}
CiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOyAKIAojZGVmaW5lIGFsbCh2KSB2LmJlZ2luKCksIHYuZW5kKCkgCnR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCB1bGxpOyAKdHlwZWRlZiBsb25nIGxvbmcgaW50IGxsOwogCnZlY3Rvcjx1bGxpPiBzaWV2ZSh1bGxpIG4pIAp7IAoJIAoJdmVjdG9yPGJvb2w+IHByaW1lKG4gKyAxLCB0cnVlKTsgCiAKCXByaW1lWzBdID0gZmFsc2U7IAoJcHJpbWVbMV0gPSBmYWxzZTsgCglsb25nIGxvbmcgaW50IG0gPSBzcXJ0KG4pOyAKIAoJZm9yICh1bGxpIHAgPSAyOyBwIDw9IG07IHArKykgeyAKIAoJCS8vIElmIHByaW1lW3BdIGlzIG5vdCBjaGFuZ2VkLCB0aGVuIGl0IAoJCS8vIGlzIGEgcHJpbWUgCgkJaWYgKHByaW1lW3BdKSB7IAogCgkJCS8vIFVwZGF0ZSBhbGwgbXVsdGlwbGVzIG9mIHAgCgkJCWZvciAodWxsaSBpID0gcCAqIDI7IGkgPD0gbjsgaSArPSBwKSAKCQkJCXByaW1lW2ldID0gZmFsc2U7IAoJCX0gCgl9IAogCgkvLyBwdXNoIGFsbCB0aGUgcHJpbWVzIGludG8gdGhlIHZlY3RvciBhbnMgCgl2ZWN0b3I8dWxsaT4gYW5zOyAKCWZvciAobG9uZyBsb25nIGludCBpID0gMDsgaSA8IG47IGkrKykgCgkJaWYgKHByaW1lW2ldKSAKCQkJYW5zLnB1c2hfYmFjayhpKTsgCglyZXR1cm4gYW5zOyAKfSAKIAp2ZWN0b3I8dWxsaT4gc2lldmVSYW5nZSh1bGxpIHN0YXJ0LCB1bGxpIGVuZCkgCnsgCgkvLyBmaW5kIHByaW1lcyBmcm9tIFswLi5lbmRdIHJhbmdlIAoJdmVjdG9yPHVsbGk+IGFucyA9IHNpZXZlKGVuZCk7IAogCgkvLyBGaW5kIGluZGV4IG9mIGZpcnN0IHByaW1lIGdyZWF0ZXIgdGhhbiBvciAKCS8vIGVxdWFsIHRvIHN0YXJ0IAoJLy8gTyhzcXJ0KG4pbG9nbG9nKG4pKSAKCWxvbmcgbG9uZyBpbnQgbG93ZXJfYm91bmRfaW5kZXggPSBsb3dlcl9ib3VuZChhbGwoYW5zKSwgc3RhcnQpIC0gCgkJCQkJCQkJCQkJYW5zLmJlZ2luKCk7IAogCgkvLyBSZW1vdmUgYWxsIGVsZW1lbnRzIHNtYWxsZXIgdGhhbiBzdGFydC4gCgkvLyBPKGxvZ24pIAoJYW5zLmVyYXNlKGFucy5iZWdpbigpLCBhbnMuYmVnaW4oKSArIGxvd2VyX2JvdW5kX2luZGV4KTsgCiAKCXJldHVybiBhbnM7IAp9IAogCi8vIERyaXZlciBQcm9ncmFtIHRvIHRlc3QgYWJvdmUgZnVuY3Rpb24gCmludCBtYWluKCkgCiAKewogICAgbG9uZyBsb25nIGludCB0LGYsbCxyOwogICAgCiAgICB2ZWN0b3I8bG9uZyBsb25nIGludD4gYSgxMDAwMDAwLCAwKTsKICAgIAogICAgbD0xOwogICAgcj02MDA7CiAgICBmPTA7CgogICAgICAgIG1hcDxpbnQsaW50PiBhMjsKICAgICAgICByKys7Cgl1bGxpIHN0YXJ0ID0gbDsgCgl1bGxpIGVuZCA9IHI7IAoJdmVjdG9yPHVsbGk+IGFucyA9IHNpZXZlUmFuZ2Uoc3RhcnQsIGVuZCk7IAoJZm9yIChhdXRvIGkgOiBhbnMpIAogCnsgYVtmXT1pOwphMltpXSsrOwoJCS8vY291dDw8YVtmXTw8IlxuIjsKZisrOwp9CgovL2NvdXQ8PGEyWzU5OV07CgpsbCBsMSxyMTsKY2luPj5sMT4+cjE7CmxsIGk7Cmk9bDE7bGwgYz0wOwp3aGlsZShpPD1yMSkKewogICAgCiAgICBsbCBrPWk7CiAgICBsbCBzPTA7CiAgICBsbCBzMT0wOwogICAgd2hpbGUoayE9MCkKICAgIHsKICAgICAgICAKICAgICAgICBsbCBnZj1rJTEwOwogICAgICAgIHM9cytnZjsKICAgICAgICBzMT1zMSsoZ2YqZ2YpOwogICAgICAgIGs9ay8xMDsKICAgICAgICAKICAgIH0KICAgIAogICAgaWYoYTJbc109PTEgJiYgYTJbczFdPT0xKQogICAgewogICAgICAgIC8vY291dDw8aTw8IlxuIjsKICAgICAgICBjKys7CiAgICB9CiAgICAKICAgIAogICAgCiAgICBpKys7Cn0KY291dDw8YzsKCglyZXR1cm4gMDsgCn0gCg==