/*
本题关键在于找到1~9之间的最小公倍数 9*8*5*7=2520
1.....9
2 4 6 8
3 6 9
4 8
5
6
7
8
9
*/
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<map>//用于离散化操作数据较大
#define MAXN 25
using namespace std;
typedef long long ll;
const int mod=2520;
int t,a[MAXN];
ll num[MAXN];
ll l,r;
ll dp[MAXN][2600][50];
/*
dp[pos][num][lcm],pos表示当前位置,num表示当前处理的数的大小,当前所有数位的lcm
求出2520的所有的因子,进行离散化为50,防止MLE
*/
map<int,int> mp;
ll gcd(ll a,ll b)//最大公约数
{
return b?gcd(b,a%b):a;
}
ll dfs(int pos,int pd,int limit,int lcm)
{
if(pos==0)
return pd%lcm==0;
if(!limit&&dp[pos][pd][mp[lcm]]!=-1)
return dp[pos][pd][mp[lcm]];
int up=limit?a[pos]:9;
ll res=0;
for(int i=0;i<=up;i++)
{
if(i==0)
res+=dfs(pos-1,pd,(i==up)&&limit,lcm);
else
res+=dfs(pos-1,(pd+(ll)i*num[pos-1]%mod)%mod,(i==up)&&limit,i*lcm/gcd(lcm,i));
}
if(!limit)
return dp[pos][pd][mp[lcm]]=res;
return res;
}
ll cal(ll x)
{
int cnt=0;
//memset(dp,-1,sizeof(dp));
while(x)
{
a[++cnt]=x%10;
x/=10;
}
return dfs(cnt,0,1,1);
}
int main()
{
num[0]=1;
for(int i=1;i<=18;i++)
num[i]=10*num[i-1];
//1 10 100 1000 ... 10^18
scanf("%d",&t);
memset(dp,-1,sizeof(dp));
//离散化
int sum=0;
for(int i=1;i<=2520;i++)//将2520的所有因子离散化
if(2520%i==0)
mp[i]=sum++;
while(t--)
{
//用scanf也能过
cin >> l >> r;
cout << cal(r)-cal(l-1) << endl;
}
return 0;
}