import math
MAX_SUM = 73
prime = [True for i in range(MAX_SUM)]
def sieve():
prime[0] = prime[1] = False
for i in range
(2, int(math.
sqrt(MAX_SUM
))): if prime[i]:
for j in range(i * i, MAX_SUM, i):
prime[j] = False
def compute_digits_list(n):
digits = []
while n > 0:
digits.append(n % 10)
n //= 10
digits.reverse()
return digits
def compute_digit_dp(n):
digits = compute_digits_list(n)
digit_dp = [[[0 for k in range(2)] for j in range(MAX_SUM)] for i in range(len(digits))]
for i in range(digits[0]):
digit_dp[0][i][1] = 1
digit_dp[0][digits[0]][0] = 1
for i in range(1, len(digits)):
for j in range(0, 10):
for sum in range(j, MAX_SUM):
digit_dp[i][sum][1] += digit_dp[i - 1][sum - j][1]
if j < digits[i]:
digit_dp[i][sum][1] += digit_dp[i - 1][sum - j][0]
if j == digits[i]:
digit_dp[i][sum][0] += digit_dp[i - 1][sum - j][0]
return digit_dp
def compute_g_one_numbers(n):
if n < 2:
return 0
g_one_nums = 0
digit_dp = compute_digit_dp(n)
for sum in range(0, MAX_SUM):
if prime[sum]:
for isLessThan in range(2):
g_one_nums += digit_dp[len(digit_dp) - 1][sum][isLessThan]
return g_one_nums
def main_program():
sieve()
test_cases = int(input())
while test_cases > 0:
start, end = map(int, input().split())
print(compute_g_one_numbers(end) - compute_g_one_numbers(start - 1))
test_cases -= 1
if __name__ == '__main__':
main_program()
aW1wb3J0IG1hdGgKCk1BWF9TVU0gPSA3MwpwcmltZSA9IFtUcnVlIGZvciBpIGluIHJhbmdlKE1BWF9TVU0pXQoKCmRlZiBzaWV2ZSgpOgogICAgcHJpbWVbMF0gPSBwcmltZVsxXSA9IEZhbHNlCiAgICBmb3IgaSBpbiByYW5nZSgyLCBpbnQobWF0aC5zcXJ0KE1BWF9TVU0pKSk6CiAgICAgICAgaWYgcHJpbWVbaV06CiAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKGkgKiBpLCBNQVhfU1VNLCBpKToKICAgICAgICAgICAgICAgIHByaW1lW2pdID0gRmFsc2UKCgpkZWYgY29tcHV0ZV9kaWdpdHNfbGlzdChuKToKICAgIGRpZ2l0cyA9IFtdCiAgICB3aGlsZSBuID4gMDoKICAgICAgICBkaWdpdHMuYXBwZW5kKG4gJSAxMCkKICAgICAgICBuIC8vPSAxMAoKICAgIGRpZ2l0cy5yZXZlcnNlKCkKICAgIHJldHVybiBkaWdpdHMKCgpkZWYgY29tcHV0ZV9kaWdpdF9kcChuKToKICAgIGRpZ2l0cyA9IGNvbXB1dGVfZGlnaXRzX2xpc3QobikKCiAgICBkaWdpdF9kcCA9IFtbWzAgZm9yIGsgaW4gcmFuZ2UoMildIGZvciBqIGluIHJhbmdlKE1BWF9TVU0pXSBmb3IgaSBpbiByYW5nZShsZW4oZGlnaXRzKSldCgogICAgZm9yIGkgaW4gcmFuZ2UoZGlnaXRzWzBdKToKICAgICAgICBkaWdpdF9kcFswXVtpXVsxXSA9IDEKCiAgICBkaWdpdF9kcFswXVtkaWdpdHNbMF1dWzBdID0gMQoKICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihkaWdpdHMpKToKICAgICAgICBmb3IgaiBpbiByYW5nZSgwLCAxMCk6CiAgICAgICAgICAgIGZvciBzdW0gaW4gcmFuZ2UoaiwgTUFYX1NVTSk6CiAgICAgICAgICAgICAgICBkaWdpdF9kcFtpXVtzdW1dWzFdICs9IGRpZ2l0X2RwW2kgLSAxXVtzdW0gLSBqXVsxXQogICAgICAgICAgICAgICAgaWYgaiA8IGRpZ2l0c1tpXToKICAgICAgICAgICAgICAgICAgICBkaWdpdF9kcFtpXVtzdW1dWzFdICs9IGRpZ2l0X2RwW2kgLSAxXVtzdW0gLSBqXVswXQoKICAgICAgICAgICAgICAgIGlmIGogPT0gZGlnaXRzW2ldOgogICAgICAgICAgICAgICAgICAgIGRpZ2l0X2RwW2ldW3N1bV1bMF0gKz0gZGlnaXRfZHBbaSAtIDFdW3N1bSAtIGpdWzBdCgogICAgcmV0dXJuIGRpZ2l0X2RwCgoKZGVmIGNvbXB1dGVfZ19vbmVfbnVtYmVycyhuKToKICAgIGlmIG4gPCAyOgogICAgICAgIHJldHVybiAwCgogICAgZ19vbmVfbnVtcyA9IDAKCiAgICBkaWdpdF9kcCA9IGNvbXB1dGVfZGlnaXRfZHAobikKCiAgICBmb3Igc3VtIGluIHJhbmdlKDAsIE1BWF9TVU0pOgogICAgICAgIGlmIHByaW1lW3N1bV06CiAgICAgICAgICAgIGZvciBpc0xlc3NUaGFuIGluIHJhbmdlKDIpOgogICAgICAgICAgICAgICAgZ19vbmVfbnVtcyArPSBkaWdpdF9kcFtsZW4oZGlnaXRfZHApIC0gMV1bc3VtXVtpc0xlc3NUaGFuXQoKICAgIHJldHVybiBnX29uZV9udW1zCgoKZGVmIG1haW5fcHJvZ3JhbSgpOgogICAgc2lldmUoKQogICAgdGVzdF9jYXNlcyA9IGludChpbnB1dCgpKQogICAgd2hpbGUgdGVzdF9jYXNlcyA+IDA6CiAgICAgICAgc3RhcnQsIGVuZCA9IG1hcChpbnQsIGlucHV0KCkuc3BsaXQoKSkKICAgICAgICBwcmludChjb21wdXRlX2dfb25lX251bWJlcnMoZW5kKSAtIGNvbXB1dGVfZ19vbmVfbnVtYmVycyhzdGFydCAtIDEpKQogICAgICAgIHRlc3RfY2FzZXMgLT0gMQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluX3Byb2dyYW0oKQo=