#include <bits/stdc++.h>
using namespace std;
#define Fast \
{ \
ios_base::sync_with_stdio(0); \
cin.tie(0); \
cout.tie(0); \
}
#define int long long
const int MOD = 1e9 + 7;
const int Limit = 55;
int dp[55][110][110][2][2][2];
void sol()
{
string A, B;
cin >> A >> B;
string s;
function<int(int, int, int, int, int, int)> recur = [&](int idx, int d1, int d2, int tight, int started, int has3) -> int
{
if (idx == (int)s.size())
return (d1 == Limit && d2 == Limit && has3);
int &ret = dp[idx][d1][d2][tight][started][has3];
if (ret != -1)
return ret;
ret = 0;
int end = (tight ? s[idx] - '0' : 9);
for (int i = 0; i <= end; i++)
{
int ns = (started || (i != 0));
int nd1 = d1 + (ns && i == 3) - (ns && i == 6);
int nd2 = d2 + (ns && i == 6) - (ns && i == 9);
if (nd1 < 0 || nd1 >= 110 || nd2 < 0 || nd2 >= 110)
continue;
ret = (ret + recur(idx + 1, nd1, nd2, (tight && (i == end)), ns, (has3 || (ns && i == 3)))) % MOD;
}
return ret;
};
auto minusOne = [&](string a)
{
int i = a.size() - 1;
while (i >= 0 && a[i] == '0')
{
a[i] = '9';
i--;
}
if (i >= 0)
a[i]--;
if (a[0] == '0')
{
int j = 0;
while (j < (int)a.size() && a[j] == '0')
j++;
if (j == (int)a.size())
return string("0");
a = a.substr(j);
}
return a;
};
s = B;
memset(dp, -1, sizeof(dp));
int resB = recur(0, Limit, Limit, 1, 0, 0);
A = minusOne(A);
s = A;
memset(dp, -1, sizeof(dp));
int resA = recur(0, Limit, Limit, 1, 0, 0);
int ans = (resB - resA) % MOD;
if (ans < 0)
ans += MOD;
cout << ans << '\n';
}
int32_t main()
{
Fast;
int t = 1;
cin >> t;
while (t--)
{
sol();
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgRmFzdCAgICAgICAgICAgICAgICAgICAgICBcCiAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBcCiAgICBjaW4udGllKDApOyAgICAgICAgICAgICAgICAgICBcCiAgICBjb3V0LnRpZSgwKTsgICAgICAgICAgICAgICAgICBcCiAgfQojZGVmaW5lIGludCBsb25nIGxvbmcKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7CmNvbnN0IGludCBMaW1pdCA9IDU1OwppbnQgZHBbNTVdWzExMF1bMTEwXVsyXVsyXVsyXTsKdm9pZCBzb2woKQp7CiAgc3RyaW5nIEEsIEI7CiAgY2luID4+IEEgPj4gQjsKICBzdHJpbmcgczsKICBmdW5jdGlvbjxpbnQoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCk+IHJlY3VyID0gWyZdKGludCBpZHgsIGludCBkMSwgaW50IGQyLCBpbnQgdGlnaHQsIGludCBzdGFydGVkLCBpbnQgaGFzMykgLT4gaW50CiAgewogICAgaWYgKGlkeCA9PSAoaW50KXMuc2l6ZSgpKQogICAgICByZXR1cm4gKGQxID09IExpbWl0ICYmIGQyID09IExpbWl0ICYmIGhhczMpOwogICAgaW50ICZyZXQgPSBkcFtpZHhdW2QxXVtkMl1bdGlnaHRdW3N0YXJ0ZWRdW2hhczNdOwogICAgaWYgKHJldCAhPSAtMSkKICAgICAgcmV0dXJuIHJldDsKICAgIHJldCA9IDA7CiAgICBpbnQgZW5kID0gKHRpZ2h0ID8gc1tpZHhdIC0gJzAnIDogOSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8PSBlbmQ7IGkrKykKICAgIHsKICAgICAgaW50IG5zID0gKHN0YXJ0ZWQgfHwgKGkgIT0gMCkpOwogICAgICBpbnQgbmQxID0gZDEgKyAobnMgJiYgaSA9PSAzKSAtIChucyAmJiBpID09IDYpOwogICAgICBpbnQgbmQyID0gZDIgKyAobnMgJiYgaSA9PSA2KSAtIChucyAmJiBpID09IDkpOwogICAgICBpZiAobmQxIDwgMCB8fCBuZDEgPj0gMTEwIHx8IG5kMiA8IDAgfHwgbmQyID49IDExMCkKICAgICAgICBjb250aW51ZTsKICAgICAgcmV0ID0gKHJldCArIHJlY3VyKGlkeCArIDEsIG5kMSwgbmQyLCAodGlnaHQgJiYgKGkgPT0gZW5kKSksIG5zLCAoaGFzMyB8fCAobnMgJiYgaSA9PSAzKSkpKSAlIE1PRDsKICAgIH0KICAgIHJldHVybiByZXQ7CiAgfTsKICBhdXRvIG1pbnVzT25lID0gWyZdKHN0cmluZyBhKQogIHsKICAgIGludCBpID0gYS5zaXplKCkgLSAxOwogICAgd2hpbGUgKGkgPj0gMCAmJiBhW2ldID09ICcwJykKICAgIHsKICAgICAgYVtpXSA9ICc5JzsKICAgICAgaS0tOwogICAgfQogICAgaWYgKGkgPj0gMCkKICAgICAgYVtpXS0tOwogICAgaWYgKGFbMF0gPT0gJzAnKQogICAgewogICAgICBpbnQgaiA9IDA7CiAgICAgIHdoaWxlIChqIDwgKGludClhLnNpemUoKSAmJiBhW2pdID09ICcwJykKICAgICAgICBqKys7CiAgICAgIGlmIChqID09IChpbnQpYS5zaXplKCkpCiAgICAgICAgcmV0dXJuIHN0cmluZygiMCIpOwogICAgICBhID0gYS5zdWJzdHIoaik7CiAgICB9CiAgICByZXR1cm4gYTsKICB9OwogIHMgPSBCOwogIG1lbXNldChkcCwgLTEsIHNpemVvZihkcCkpOwogIGludCByZXNCID0gcmVjdXIoMCwgTGltaXQsIExpbWl0LCAxLCAwLCAwKTsKICBBID0gbWludXNPbmUoQSk7CiAgcyA9IEE7CiAgbWVtc2V0KGRwLCAtMSwgc2l6ZW9mKGRwKSk7CiAgaW50IHJlc0EgPSByZWN1cigwLCBMaW1pdCwgTGltaXQsIDEsIDAsIDApOwogIGludCBhbnMgPSAocmVzQiAtIHJlc0EpICUgTU9EOwogIGlmIChhbnMgPCAwKQogICAgYW5zICs9IE1PRDsKICBjb3V0IDw8IGFucyA8PCAnXG4nOwp9CmludDMyX3QgbWFpbigpCnsKICBGYXN0OwogIGludCB0ID0gMTsKICBjaW4gPj4gdDsKICB3aGlsZSAodC0tKQogIHsKICAgIHNvbCgpOwogIH0KfQ==