#include <bits/stdc++.h>
#define endl '\n'
typedef int ll;
using namespace std;
const ll MOD = 1e9 + 7;
ll dp[51][17][17][17][2], t;
unordered_map<string, ll> cnt;
string a, b;
ll f(string &s, ll pos, ll three, ll six, ll nine, ll tight) {
if (three > s.size() / 3 || six > s.size() / 3 || nine > s.size() / 3) return 0;
if (pos == 0) {
if ((three == six) && (six == nine) && three > 0) return 1;
return 0;
}
ll res = dp[pos][three][six][nine][tight];
if (res != -1) return res;
ll ans = 0, limit = (tight == 1) ? (s[s.size() - pos] - '0') : 9;
for (ll i = 0; i <= limit; i++) {
if (i == 3) {
ans += f(s, pos - 1, three + 1, six, nine, (tight & (limit == i)));
} else if (i == 6) {
ans += f(s, pos - 1, three, six + 1, nine, (tight & (limit == i)));
} else if (i == 9) {
ans += f(s, pos - 1, three, six, nine + 1, (tight & (limit == i)));
} else {
ans += f(s, pos - 1, three, six, nine, (tight & (limit == i)));
}
ans %= MOD;
}
dp[pos][three][six][nine][tight] = ans % MOD;
return ans % MOD;
}
ll g(string &s) {
ll three = 0, six = 0, nine = 0;
for (ll i = 0; i < s.size(); i++) {
if (s[i] == '3') three++;
if (s[i] == '6') six++;
if (s[i] == '9') nine++;
}
return ((three == six) && (six == nine) && three > 0);
}
void sol() {
cin >> a >> b;
memset(dp, -1, sizeof(dp));
ll ans = f(b, b.size(), 0, 0, 0, 1);
memset(dp, -1, sizeof(dp));
ll val = ans - f(a, a.size(), 0, 0, 0, 1) + g(a);
if (val >= MOD) val -= MOD;
else if (val < 0) val += MOD;
cout << val << endl;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
// freopen(".INP", "r", stdin);
// freopen(".OUT", "w", stdout);
cin >> t;
while (t--) sol();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgZW5kbCAnXG4nCnR5cGVkZWYgaW50IGxsOwp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgbGwgTU9EID0gMWU5ICsgNzsKbGwgZHBbNTFdWzE3XVsxN11bMTddWzJdLCB0Owp1bm9yZGVyZWRfbWFwPHN0cmluZywgbGw+IGNudDsKc3RyaW5nIGEsIGI7CgpsbCBmKHN0cmluZyAmcywgbGwgcG9zLCBsbCB0aHJlZSwgbGwgc2l4LCBsbCBuaW5lLCBsbCB0aWdodCkgewogICAgaWYgKHRocmVlID4gcy5zaXplKCkgLyAzIHx8IHNpeCA+IHMuc2l6ZSgpIC8gMyB8fCBuaW5lID4gcy5zaXplKCkgLyAzKSByZXR1cm4gMDsKICAgIGlmIChwb3MgPT0gMCkgewogICAgICAgIGlmICgodGhyZWUgPT0gc2l4KSAmJiAoc2l4ID09IG5pbmUpICYmIHRocmVlID4gMCkgcmV0dXJuIDE7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBsbCByZXMgPSBkcFtwb3NdW3RocmVlXVtzaXhdW25pbmVdW3RpZ2h0XTsKICAgIGlmIChyZXMgIT0gLTEpIHJldHVybiByZXM7CiAgICBsbCBhbnMgPSAwLCBsaW1pdCA9ICh0aWdodCA9PSAxKSA/IChzW3Muc2l6ZSgpIC0gcG9zXSAtICcwJykgOiA5OwogICAgZm9yIChsbCBpID0gMDsgaSA8PSBsaW1pdDsgaSsrKSB7CiAgICAgICAgaWYgKGkgPT0gMykgewogICAgICAgICAgICBhbnMgKz0gZihzLCBwb3MgLSAxLCB0aHJlZSArIDEsIHNpeCwgbmluZSwgKHRpZ2h0ICYgKGxpbWl0ID09IGkpKSk7CiAgICAgICAgfSBlbHNlIGlmIChpID09IDYpIHsKICAgICAgICAgICAgYW5zICs9IGYocywgcG9zIC0gMSwgdGhyZWUsIHNpeCArIDEsIG5pbmUsICh0aWdodCAmIChsaW1pdCA9PSBpKSkpOwogICAgICAgIH0gZWxzZSBpZiAoaSA9PSA5KSB7CiAgICAgICAgICAgIGFucyArPSBmKHMsIHBvcyAtIDEsIHRocmVlLCBzaXgsIG5pbmUgKyAxLCAodGlnaHQgJiAobGltaXQgPT0gaSkpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhbnMgKz0gZihzLCBwb3MgLSAxLCB0aHJlZSwgc2l4LCBuaW5lLCAodGlnaHQgJiAobGltaXQgPT0gaSkpKTsKICAgICAgICB9CiAgICAgICAgYW5zICU9IE1PRDsKICAgIH0KICAgIGRwW3Bvc11bdGhyZWVdW3NpeF1bbmluZV1bdGlnaHRdID0gYW5zICUgTU9EOwogICAgcmV0dXJuIGFucyAlIE1PRDsKfQoKbGwgZyhzdHJpbmcgJnMpIHsKICAgIGxsIHRocmVlID0gMCwgc2l4ID0gMCwgbmluZSA9IDA7CiAgICBmb3IgKGxsIGkgPSAwOyBpIDwgcy5zaXplKCk7IGkrKykgewogICAgICAgIGlmIChzW2ldID09ICczJykgdGhyZWUrKzsKICAgICAgICBpZiAoc1tpXSA9PSAnNicpIHNpeCsrOwogICAgICAgIGlmIChzW2ldID09ICc5JykgbmluZSsrOwogICAgfQogICAgcmV0dXJuICgodGhyZWUgPT0gc2l4KSAmJiAoc2l4ID09IG5pbmUpICYmIHRocmVlID4gMCk7Cn0KCnZvaWQgc29sKCkgewogICAgY2luID4+IGEgPj4gYjsKICAgIG1lbXNldChkcCwgLTEsIHNpemVvZihkcCkpOwogICAgbGwgYW5zID0gZihiLCBiLnNpemUoKSwgMCwgMCwgMCwgMSk7CiAgICBtZW1zZXQoZHAsIC0xLCBzaXplb2YoZHApKTsKICAgIGxsIHZhbCA9IGFucyAtIGYoYSwgYS5zaXplKCksIDAsIDAsIDAsIDEpICsgZyhhKTsKICAgIGlmICh2YWwgPj0gTU9EKSB2YWwgLT0gTU9EOwogICAgZWxzZSBpZiAodmFsIDwgMCkgdmFsICs9IE1PRDsKICAgIGNvdXQgPDwgdmFsIDw8IGVuZGw7Cn0KCmludCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOwoKLy8gICAgZnJlb3BlbigiLklOUCIsICJyIiwgc3RkaW4pOwovLyAgICBmcmVvcGVuKCIuT1VUIiwgInciLCBzdGRvdXQpOwoKICAgIGNpbiA+PiB0OwogICAgd2hpbGUgKHQtLSkgc29sKCk7CgogICAgcmV0dXJuIDA7Cn0KCg==