/*
ans=[1,r]内的友好数个数减去[1,l-1]内的个数
当边界x为一位数时 ans=x/3;
x为两位数时
10~19 7个 (除 11 14 17)
20~29 7个(除 22 25 28)
30~39 10个
由于取模
40+,70+ 等同于 10+
50+,80+ 等同于 20+
60+,90+ 等同于30+
x为三位数时,
当后两位为友好数时,x必为友好数
当后两位不是友好数时,百位添 1或2 要么前两位是友好数,要么整个数是三的倍数
百位添 3 一定是友好数
由于取模,添 4,5,6,7,8,9 时等同
所以大于等于100的数一定是友好数
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ans;
const int maxn=2005;
int a[9]={0,7,14,24,31,38,48,55,62};
int b[10]={1,1,2,3,3,4,5,5,6,7};//10+
int c[10]={1,2,2,3,4,4,5,6,6,7};//20+
ll solve(ll x)
{
ll t=0;
if(x<10)
{
t=x/3;
return t;
}
else if(x<100)
{
ll k1=x/10;
t+=a[k1-1];
ll k2=x%10;
if(k1%3==0) t+=k2+1;
else if(k1%3==1) t+=b[k2];
else if(k1%3==2) t+=c[k2];
return t+3;
}
else return (x-100+76) ;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
ll l,r;
cin>>l>>r;
cout<<solve(r)-solve(l-1)<<endl;
}
return 0;
}
//超强队友!!!
#include "bits/stdc++.h"
using namespace std;
long long shu(long long x){
if (x < 10){
return x / 3 + 1;// 0 也算上了
}
long long int ans = 4;// 0也算上了
if (x < 100)
{
for (int i = 10; i <= x; i++)
{
int a = i / 10;
int b = i % 10;
// 特判 11 14 17 22 25 28
if (a % 3 == b % 3)
{
if (a % 3 == 0) ans++;
}
else ans++;
}
}
else {
ans = 76 + x - 100 + 1;
}
return ans;
}
int main(){
int t;
cin >> t;
while(t--){
long long l, r;
cin >> l >> r;
//cout << shu(l) << " " << shu(r) << endl;
cout << shu(r) - shu(l - 1) << endl;
}
return 0;
}