using
System;
using
System.Collections.Generic;
class
GFG
{
static
List<
int
> num =
new
List<
int
>();
static
int
[, , , ] dp =
new
int
[19, 2, 2, 19];
static
bool
isPrime(
int
n)
{
if
(n <= 1)
return
false
;
if
(n <= 3)
return
true
;
if
(n % 2 == 0 || n % 3 == 0)
return
false
;
for
(
int
i = 5; i * i <= n; i = i + 6) {
if
(n % i == 0 || n % (i + 2) == 0)
return
false
;
}
return
true
;
}
static
int
cntNum(
int
pos,
int
st,
int
tight,
int
prime)
{
if
(pos == num.Count)
return
1;
if
(dp[pos, st, tight, prime] != -1)
return
dp[pos, st, tight, prime];
int
res = 0;
int
end = (tight == 0) ? num[pos] : 9;
for
(
int
i = 0; i <= end; i++) {
int
ntight = (i < end) ? 1 : tight;
int
nzero = (i != 0) ? 1 : st;
if
((nzero == 1) && isPrime(i)
&& isPrime(prime)) {
res += cntNum(pos + 1, nzero, ntight,
prime + 1);
}
if
((nzero == 1) && !isPrime(i)
&& !isPrime(prime)) {
res += cntNum(pos + 1, nzero, ntight,
prime + 1);
}
if
(nzero == 0)
res += cntNum(pos + 1, nzero, ntight,
prime);
}
return
dp[pos, st, tight, prime] = res;
}
static
int
cntZeroRange(
int
b)
{
num.Clear();
while
(b > 0) {
num.Add(b % 10);
b /= 10;
}
num.Reverse();
for
(
int
i = 0; i < 19; i++)
for
(
int
j = 0; j < 2; j++)
for
(
int
k = 0; k < 2; k++)
for
(
int
l = 0; l < 19; l++)
dp[i, j, k, l] = -1;
int
res = cntNum(0, 0, 0, 1);
return
res;
}
public
static
void
Main(
string
[] args)
{
int
L = 5, R = 22;
int
res = cntZeroRange(R) - cntZeroRange(L - 1);
Console.WriteLine(res +
"\n"
);
}
}