#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;
int dp[52][18][18][18][2];
int vis[52][18][18][18][2];
int testCase = 1;
string subtractOne(string s) {
if (s == "0") return "0";
int n = s.size();
for (int i = n - 1; i >= 0; i--) {
if (s[i] > '0') {
s[i]--;
break;
} else s[i] = '9';
}
int first = s.find_first_not_of('0');
return (first == string::npos) ? "0" : s.substr(first);
}
void sol() {
string l , r;
cin >> l >> r;
string s = r;
function<int(int,int,int,int,bool)>recur = [&](int idx , int cnt3 , int cnt6 , int cnt9 , bool tight) -> int {
if(cnt3 >= 18 || cnt6 >= 18 || cnt9 >= 18)
return 0;
if(idx == s.size())
return (cnt3 > 0 && cnt3 == cnt6 && cnt6 == cnt9);
int &ret = dp[idx][cnt3][cnt6][cnt9][tight];
if(vis[idx][cnt3][cnt6][cnt9][tight] == testCase)
return ret;
vis[idx][cnt3][cnt6][cnt9][tight] = testCase;
ret = 0;
int end = (tight ? s[idx] - '0' : 9);
for (int i = 0; i <= end; ++i) {
ret = (ret + recur(idx + 1, cnt3 + (i == 3), cnt6 + (i == 6), cnt9 + (i == 9), tight && (i == end))) % Mod;
}
return ret;
};
s = r;
testCase++;
int ansB = recur(0, 0, 0, 0, 1);
s = subtractOne(l);
testCase++;
int ansA = recur(0, 0, 0, 0, 1);
cout << (ansB - ansA + Mod) % Mod << '\n';
}
int32_t main()
{
Fast;
int t = 1;
cin >> t;
while(t--) {
sol();
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgRmFzdCAgICAgICAgICAgICAgICAgICAgICBcCiAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBcCiAgICBjaW4udGllKDApOyAgICAgICAgICAgICAgICAgICBcCiAgICBjb3V0LnRpZSgwKTsgICAgICAgICAgICAgICAgICBcCiAgfQovLyAjZGVmaW5lIGludCBsb25nIGxvbmcKY29uc3QgaW50IE1vZCA9IDFlOSArIDc7CmludCBkcFs1Ml1bMThdWzE4XVsxOF1bMl07CmludCB2aXNbNTJdWzE4XVsxOF1bMThdWzJdOwppbnQgdGVzdENhc2UgPSAxOwpzdHJpbmcgc3VidHJhY3RPbmUoc3RyaW5nIHMpIHsKICAgIGlmIChzID09ICIwIikgcmV0dXJuICIwIjsKICAgIGludCBuID0gcy5zaXplKCk7CiAgICBmb3IgKGludCBpID0gbiAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgaWYgKHNbaV0gPiAnMCcpIHsKICAgICAgICAgICAgc1tpXS0tOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9IGVsc2Ugc1tpXSA9ICc5JzsKICAgIH0KICAgIGludCBmaXJzdCA9IHMuZmluZF9maXJzdF9ub3Rfb2YoJzAnKTsKICAgIHJldHVybiAoZmlyc3QgPT0gc3RyaW5nOjpucG9zKSA/ICIwIiA6IHMuc3Vic3RyKGZpcnN0KTsKfQp2b2lkIHNvbCgpIHsKICBzdHJpbmcgbCAsIHI7CiAgY2luID4+IGwgPj4gcjsKICBzdHJpbmcgcyA9IHI7CiAgZnVuY3Rpb248aW50KGludCxpbnQsaW50LGludCxib29sKT5yZWN1ciA9IFsmXShpbnQgaWR4ICwgaW50IGNudDMgLCBpbnQgY250NiAsIGludCBjbnQ5ICwgYm9vbCB0aWdodCkgLT4gaW50IHsKICAgIGlmKGNudDMgPj0gMTggfHwgY250NiA+PSAxOCB8fCBjbnQ5ID49IDE4KQogICAgICByZXR1cm4gMDsKICAgIGlmKGlkeCA9PSBzLnNpemUoKSkKICAgICAgcmV0dXJuIChjbnQzID4gMCAmJiBjbnQzID09IGNudDYgJiYgY250NiA9PSBjbnQ5KTsKICAgIGludCAmcmV0ID0gZHBbaWR4XVtjbnQzXVtjbnQ2XVtjbnQ5XVt0aWdodF07CiAgICBpZih2aXNbaWR4XVtjbnQzXVtjbnQ2XVtjbnQ5XVt0aWdodF0gPT0gdGVzdENhc2UpIAogICAgICByZXR1cm4gcmV0OwogICAgdmlzW2lkeF1bY250M11bY250Nl1bY250OV1bdGlnaHRdID0gdGVzdENhc2U7CiAgICByZXQgPSAwOwogICAgaW50IGVuZCA9ICh0aWdodCA/IHNbaWR4XSAtICcwJyA6IDkpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gZW5kOyArK2kpIHsKICAgICAgICByZXQgPSAocmV0ICsgcmVjdXIoaWR4ICsgMSwgY250MyArIChpID09IDMpLCBjbnQ2ICsgKGkgPT0gNiksIGNudDkgKyAoaSA9PSA5KSwgdGlnaHQgJiYgKGkgPT0gZW5kKSkpICUgTW9kOwogICAgfQogICAgcmV0dXJuIHJldDsKICB9OwogIHMgPSByOwogIHRlc3RDYXNlKys7CiAgaW50IGFuc0IgPSByZWN1cigwLCAwLCAwLCAwLCAxKTsKICBzID0gc3VidHJhY3RPbmUobCk7CiAgdGVzdENhc2UrKzsKICBpbnQgYW5zQSA9IHJlY3VyKDAsIDAsIDAsIDAsIDEpOwogIGNvdXQgPDwgKGFuc0IgLSBhbnNBICsgTW9kKSAlIE1vZCA8PCAnXG4nOwp9CmludDMyX3QgbWFpbigpCnsKICBGYXN0OwogIGludCB0ID0gMTsKICBjaW4gPj4gdDsKICB3aGlsZSh0LS0pIHsKICAgIHNvbCgpOwogIH0KfQ==