#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define initial first
#define added second
#define sort_all(v) sort(v.begin(), v.end())
#define ya_sayed_ya_badawy \
ios_base::sync_with_stdio(false); \
cin.tie(NULL);
const int MAX = 50 + 5;
int MOD = 1000000007;
const int OO = 1e9;
const double EPS = (double)1e-9;
string a, b;
int mem[MAX][2][2][2][50][50];
int visited[MAX][2][2][2][50][50];
const int offset = 17;
int id = 1;
int add(ll a, ll b)
{
return ((a % MOD) + (b % MOD)) % MOD;
}
int mul(ll a, ll b)
{
return ((a % MOD) * (b % MOD)) % MOD;
}
int fp(int base, int pow)
{
if (pow == 0)
{
return 1;
}
int res = fp(base, pow / 2);
if (pow % 2 == 0)
{
return mul(res, res);
}
return mul(base, mul(res, res));
}
int dp(int pos, bool exceeded_lower, bool below_upper, bool three, int diff1, int diff2)
{
if (pos == (int)b.size())
{
return (diff1 == offset) && (diff2 == offset) && (three);
}
int &ret = mem[pos][exceeded_lower][below_upper][three][diff1][diff2];
if (visited[pos][exceeded_lower][below_upper][three][diff1][diff2] == id)
{
return ret;
}
visited[pos][exceeded_lower][below_upper][three][diff1][diff2] = id;
ret = 0;
int low = exceeded_lower ? 0 : (a[pos] - '0');
int high = below_upper ? 9 : (b[pos] - '0');
for (int d = low; d <= high; ++d)
{
bool new_tight_low = exceeded_lower || (d > (a[pos] - '0'));
bool new_tight_high = below_upper || (d < (b[pos] - '0'));
bool new_three = three || (d == 3);
int new_diff1 = diff1, new_diff2 = diff2;
if (d == 3)
{
new_diff1 -= 1;
}
if (d == 6)
{
new_diff1 += 1;
new_diff2 -= 1;
}
if (d == 9)
{
new_diff2 += 1;
}
ret = add(ret, dp(pos + 1, new_tight_low, new_tight_high, new_three, new_diff1, new_diff2));
}
return ret;
}
string normalize_length(string s, int len)
{
return (string(len - (int)s.size(), '0') + s);
}
void solve(int t)
{
cin >> a >> b;
int max_len = max(a.size(), b.size());
a = normalize_length(a, max_len);
b = normalize_length(b, max_len);
int result = dp(0, 0, 0, 0, offset, offset);
id++;
cout << result;
}
signed main()
{
ya_sayed_ya_badawy int t = 1;
cin >> t;
for (int i = 1; i <= t; i++)
{
solve(i);
cout << "\n";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSB1bGwgdW5zaWduZWQgbG9uZyBsb25nCiNkZWZpbmUgaW5pdGlhbCBmaXJzdAojZGVmaW5lIGFkZGVkIHNlY29uZAojZGVmaW5lIHNvcnRfYWxsKHYpIHNvcnQodi5iZWdpbigpLCB2LmVuZCgpKQoKI2RlZmluZSB5YV9zYXllZF95YV9iYWRhd3kgICAgICAgICAgICBcCiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgXAogICAgY2luLnRpZShOVUxMKTsKCmNvbnN0IGludCBNQVggPSA1MCArIDU7CmludCBNT0QgPSAxMDAwMDAwMDA3Owpjb25zdCBpbnQgT08gPSAxZTk7CmNvbnN0IGRvdWJsZSBFUFMgPSAoZG91YmxlKTFlLTk7CgpzdHJpbmcgYSwgYjsKaW50IG1lbVtNQVhdWzJdWzJdWzJdWzUwXVs1MF07CmludCB2aXNpdGVkW01BWF1bMl1bMl1bMl1bNTBdWzUwXTsKCmNvbnN0IGludCBvZmZzZXQgPSAxNzsKCmludCBpZCA9IDE7CgppbnQgYWRkKGxsIGEsIGxsIGIpCnsKICAgIHJldHVybiAoKGEgJSBNT0QpICsgKGIgJSBNT0QpKSAlIE1PRDsKfQoKaW50IG11bChsbCBhLCBsbCBiKQp7CiAgICByZXR1cm4gKChhICUgTU9EKSAqIChiICUgTU9EKSkgJSBNT0Q7Cn0KCmludCBmcChpbnQgYmFzZSwgaW50IHBvdykKewogICAgaWYgKHBvdyA9PSAwKQogICAgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIGludCByZXMgPSBmcChiYXNlLCBwb3cgLyAyKTsKCiAgICBpZiAocG93ICUgMiA9PSAwKQogICAgewogICAgICAgIHJldHVybiBtdWwocmVzLCByZXMpOwogICAgfQogICAgcmV0dXJuIG11bChiYXNlLCBtdWwocmVzLCByZXMpKTsKfQoKaW50IGRwKGludCBwb3MsIGJvb2wgZXhjZWVkZWRfbG93ZXIsIGJvb2wgYmVsb3dfdXBwZXIsIGJvb2wgdGhyZWUsIGludCBkaWZmMSwgaW50IGRpZmYyKQp7CiAgICBpZiAocG9zID09IChpbnQpYi5zaXplKCkpCiAgICB7CiAgICAgICAgcmV0dXJuIChkaWZmMSA9PSBvZmZzZXQpICYmIChkaWZmMiA9PSBvZmZzZXQpICYmICh0aHJlZSk7CiAgICB9CgogICAgaW50ICZyZXQgPSBtZW1bcG9zXVtleGNlZWRlZF9sb3dlcl1bYmVsb3dfdXBwZXJdW3RocmVlXVtkaWZmMV1bZGlmZjJdOwogICAgaWYgKHZpc2l0ZWRbcG9zXVtleGNlZWRlZF9sb3dlcl1bYmVsb3dfdXBwZXJdW3RocmVlXVtkaWZmMV1bZGlmZjJdID09IGlkKQogICAgewogICAgICAgIHJldHVybiByZXQ7CiAgICB9CgogICAgdmlzaXRlZFtwb3NdW2V4Y2VlZGVkX2xvd2VyXVtiZWxvd191cHBlcl1bdGhyZWVdW2RpZmYxXVtkaWZmMl0gPSBpZDsKCiAgICByZXQgPSAwOwogICAgaW50IGxvdyA9IGV4Y2VlZGVkX2xvd2VyID8gMCA6IChhW3Bvc10gLSAnMCcpOwogICAgaW50IGhpZ2ggPSBiZWxvd191cHBlciA/IDkgOiAoYltwb3NdIC0gJzAnKTsKCiAgICBmb3IgKGludCBkID0gbG93OyBkIDw9IGhpZ2g7ICsrZCkKICAgIHsKICAgICAgICBib29sIG5ld190aWdodF9sb3cgPSBleGNlZWRlZF9sb3dlciB8fCAoZCA+IChhW3Bvc10gLSAnMCcpKTsKICAgICAgICBib29sIG5ld190aWdodF9oaWdoID0gYmVsb3dfdXBwZXIgfHwgKGQgPCAoYltwb3NdIC0gJzAnKSk7CiAgICAgICAgYm9vbCBuZXdfdGhyZWUgPSB0aHJlZSB8fCAoZCA9PSAzKTsKCiAgICAgICAgaW50IG5ld19kaWZmMSA9IGRpZmYxLCBuZXdfZGlmZjIgPSBkaWZmMjsKCiAgICAgICAgaWYgKGQgPT0gMykKICAgICAgICB7CiAgICAgICAgICAgIG5ld19kaWZmMSAtPSAxOwogICAgICAgIH0KICAgICAgICBpZiAoZCA9PSA2KQogICAgICAgIHsKICAgICAgICAgICAgbmV3X2RpZmYxICs9IDE7CiAgICAgICAgICAgIG5ld19kaWZmMiAtPSAxOwogICAgICAgIH0KICAgICAgICBpZiAoZCA9PSA5KQogICAgICAgIHsKICAgICAgICAgICAgbmV3X2RpZmYyICs9IDE7CiAgICAgICAgfQoKICAgICAgICByZXQgPSBhZGQocmV0LCBkcChwb3MgKyAxLCBuZXdfdGlnaHRfbG93LCBuZXdfdGlnaHRfaGlnaCwgbmV3X3RocmVlLCBuZXdfZGlmZjEsIG5ld19kaWZmMikpOwogICAgfQoKICAgIHJldHVybiByZXQ7Cn0KCnN0cmluZyBub3JtYWxpemVfbGVuZ3RoKHN0cmluZyBzLCBpbnQgbGVuKQp7CiAgICByZXR1cm4gKHN0cmluZyhsZW4gLSAoaW50KXMuc2l6ZSgpLCAnMCcpICsgcyk7Cn0KCnZvaWQgc29sdmUoaW50IHQpCnsKICAgIGNpbiA+PiBhID4+IGI7CgogICAgaW50IG1heF9sZW4gPSBtYXgoYS5zaXplKCksIGIuc2l6ZSgpKTsKICAgIGEgPSBub3JtYWxpemVfbGVuZ3RoKGEsIG1heF9sZW4pOwogICAgYiA9IG5vcm1hbGl6ZV9sZW5ndGgoYiwgbWF4X2xlbik7CgogICAgaW50IHJlc3VsdCA9IGRwKDAsIDAsIDAsIDAsIG9mZnNldCwgb2Zmc2V0KTsKCiAgICBpZCsrOwoKICAgIGNvdXQgPDwgcmVzdWx0Owp9CgpzaWduZWQgbWFpbigpCnsKICAgIHlhX3NheWVkX3lhX2JhZGF3eSBpbnQgdCA9IDE7CiAgICBjaW4gPj4gdDsKCiAgICBmb3IgKGludCBpID0gMTsgaSA8PSB0OyBpKyspCiAgICB7CiAgICAgICAgc29sdmUoaSk7CiAgICAgICAgY291dCA8PCAiXG4iOwogICAgfQoKICAgIHJldHVybiAwOwp9