#include<set>
#include<map>
#include<list>
#include<iomanip>
#include<cmath>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<complex>
#include<sstream>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<numeric>
#include<utility>
#include<functional>
#include<stdio.h>
#include<assert.h>
#include<memory.h>
#include<bitset>
using namespace std;


#define FilesX


#define rdi(i)          scanf("%d", &i)
#define rdii(i, j)      scanf("%d%d", &i, &j)
#define rep(i, v)       for(int i=0;i<sz(v);++i)
#define lp(i, n)        for(int i=0;i<(int)(n);++i)
#define lpi(i, j, n)    for(int i=(j);i<(int)(n);++i)
#define all(v)          ((v).begin()), ((v).end())
#define sz(v)           ((int)((v).size()))
#define clr(v, d)       memset(v, d, sizeof(v))
#define lpd(i, j, n)    for(int i=(j);i>=(int)(n);--i)

typedef long long         ll;
typedef unsigned long long   ull;
const ll OO = 1e8;
const ll OOL = 1e18;
const ll MOD = 1e9 + 7;

const double EPS = (1e-7);
int dcmp(double x, double y) { return fabs(x - y) <= EPS ? 0 : x < y ? -1 : 1; }

#define pb                  push_back
#define MP                  make_pair
#define P(x)                cout<<#x<<" = { "<<x<<" }\n"
typedef long double       ld;
typedef vector<int>       vi;
typedef vector<double>    vd;
typedef pair<int, int>    pii;
typedef pair<ll, ll>      pll;
typedef vector<pair<int, int> > vii;
typedef vector< vi >      vvi;
typedef vector< vd >      vvd;
typedef vector<string>    vs;
typedef vector<ll>        vl;
typedef vector<vector<ll> >     vvl;
typedef vector<pair<ll, ll> >   vll;

ull gcd(ull a, ull b) { return (b == 0 ? a : gcd(b, a % b)); }
ull lcm(ull a, ull b) { return (a * (b / gcd(a, b))); }

ull power(ull a, ull b){
	if (b == 0) return 1;
	if (b == 1) return a;
	ull ans = power(a, b / 2);
	ans = ans * ans;
	if (b % 2 != 0) ans *= a;
	return ans;
}

string a, b;
ll memo[51][18][18][18];

ll dp(int c, int three, int six, int nine){
	if (c == 0) return (three == six && six == nine && three > 0);
	if (three > 17 || six > 17 || nine > 17) return 0;

	ll &ret = memo[c][three][six][nine];
	if (ret != -1) return ret;

	ret = 0;
	ret += dp(c - 1, three + 1, six, nine);
	ret += dp(c - 1, three, six + 1, nine);
	ret += dp(c - 1, three, six, nine + 1);
	ret += 7 * dp(c - 1, three, six, nine);
	ret %= MOD;
	return ret;
}

ll calcNum(string s){
	ll ans = 0;
	int three = 0, six = 0, nine = 0;
	rep(cur, s){
		int d = s[cur] - '0';
		lp(i, d){
			ans += dp(s.size() - cur - 1, three + (i == 3), six + (i == 6), nine + (i == 9));
		}
		three += (d == 3);
		six += (d == 6);
		nine += (d == 9);
	}
	return ans;
}

void addOne(string &s){
	int i = s.size() - 1;
	while (i > -1 && s[i] == '9') s[i] = '0', i--;
	if (i > -1){
		s[i]++;
		return;
	}
	s.push_back('1');
	reverse(all(s));
}

int main()
{
#ifdef Files
	freopen("in.txt", "r", stdin);
	freopen("out.txt", "w", stdout);
#endif
	ios::sync_with_stdio(false);

	int t; cin >> t;
	clr(memo, -1);
	while (t--){
		cin >> a >> b;
		addOne(b);
		ll aa = calcNum(a);
		ll bb = calcNum(b);
		ll ans = (((bb - aa) % MOD) + MOD) % MOD;
		cout << ans << endl;
	}

	return 0;
}