#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<iostream>
using namespace std;
long long mod=1e9+7;
long long dp[220][3][10][10];
int dig[220];
long long fac[220];
string n,m;
long long dfs(int pos,int pre,int er,int k,int inf)
{
if(pos<1)
{
if(er==1 && k==0 && !inf)return dp[pos][er][pre][k]=1;
else if(er==1 && k==0)return 1;
return 0;
}
if(dp[pos][er][pre][k]!=-1 && !inf)return dp[pos][er][pre][k];
long long rt=0;
int endd=inf?dig[pos]:9;
for(int i=0;i<=endd;i++)
{
if(i==8 && pre==1)continue;
if(i==2 || i==3 || i==5)
rt=(rt+dfs(pos-1,i,1,(k+i*fac[pos-1])%7,inf && i==endd))%mod;
else
rt=(rt+dfs(pos-1,i,er,(k+i*fac[pos-1])%7,inf && i==endd))%mod;
}
if(!inf)
return dp[pos][er][pre][k]=rt;
else return rt;
}
long long solve(string s)
{
int l=s.size();
for(int i=0;i<l;i++)dig[i+1]=s[l-i-1]-'0';
return dfs(l,0,0,0,1);
}
string sub(string str1,string str2)
{
string str;
int tmp=str1.length()-str2.length();
int cf=0;
for(int i=str2.length()-1;i>=0;i--)
{
if(str1[tmp+i]<str2[i]+cf)
{
str=char(str1[tmp+i]-str2[i]-cf+'0'+10)+str;
cf=1;
}
else
{
str=char(str1[tmp+i]-str2[i]-cf+'0')+str;
cf=0;
}
}
for(int i=tmp-1;i>=0;i--)
{
if(str1[i]-cf>='0')
{
str=char(str1[i]-cf)+str;
cf=0;
}
else
{
str=char(str1[i]-cf+10)+str;
cf=1;
}
}
str.erase(0,str.find_first_not_of('0'));
return str;
}
int main()
{
freopen("data.in","r",stdin);
fac[1]=10;
fac[0]=1;
for(int i=1;i<=219;i++)fac[i]=(fac[i-1]*10)%7;
int T;
scanf("%d",&T);
memset(dp,-1,sizeof(dp));
while(T--)
{
cin>>n;
n=sub(n,"1");
if(n=="")n="0";
long long ans1=solve(n);
cin>>m;
long long ans2=solve(m);
printf("%lld\n",(ans2-ans1+mod)%mod);
}
return 0;
}