数位dp.
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0);
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
} int dp[][],t[]; void pre()
{
memset(dp,,sizeof dp); dp[][]=; // get时要× dp[][]=; // 0 1 2 4 5 6 7 9
dp[][]=; //
dp[][]=; // for(int i=;i<=;i++)
{
dp[i][]=*dp[i-][];
dp[i][]=dp[i-][]+*dp[i-][];
dp[i][]=dp[i-][]+*dp[i-][];
}
} int get(int x)
{
int sz=; while(x) t[sz++]=x%, x=x/;
for(int i=sz;i>=;i--) t[i]=t[i-]; int res=; bool san=,ba=; for(int i=sz;i>=;i--)
{
//该位可以放 0 1 2 3 4....t[i]-1
if(san==&&ba==)
{
//放 0 1 2
if(t[i]<=) res=res+
dp[i-][]*t[i]+
dp[i-][]*t[i]; //放 0 1 2 3 4 5 6 7
else if(t[i]<=) res=res+
dp[i-][]+
dp[i-][]*t[i]+
dp[i-][]*(t[i]-); //放 0 1 2 3 4 5 6 7 8
else if(t[i]==) res=res+
dp[i-][]+
dp[i-][]+
dp[i-][]*(t[i]-)+
dp[i-][]*(t[i]-); if(t[i]==) san=; if(t[i]==) ba=;
if(san==&&ba==) return res;
continue;
} int id,limit; if(san==) id=,limit=; else id=,limit=; //放 0 1 2 .. limit-1
if(t[i]<=limit) res=res+
dp[i-][]*t[i]+
dp[i-][id]*t[i]; //放 0 1 2 .. t[i]-1
else res=res+
dp[i-][]*(t[i]-)+
dp[i-][id]*(t[i]-); if(t[i]==) san=; if(t[i]==) ba=;
if(san==&&ba==) return res;
} return res;
} int main()
{
pre(); int T,L,R;
scanf("%d",&T); while(T--)
{
scanf("%d%d",&L,&R);
printf("%d\n",get(R+)-get(L));
}
return ;
}