思路:

了解过数位的,这题一定是可以写出来的.
我们用表示到了第i位无限制的条件下填了~的方案数.然后对于限制和非限制进行一个讨论即可.就是一个简单的递归,最后答案是.
但是有个细节值得注意,了我一会,就是你应该放到返回答案的前面,不然就会出..数组越界.(因为我只开了.)

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=21,M=4;
ll f[N][M];//到了第i位无限制的条件下填了j个1~9的方案数.
int a[N];
ll dfs(int len,int num,int limit)
{
    if(num>3)    return 0;
    if(!limit&&f[len][num]!=-1)    return     f[len][num];
    if(len==0)    return 1;    
    ll res=0;    
    if(limit)
    {
        for(int i=0;i<=a[len];i++)
        {
            if(i<a[len])    res+=dfs(len-1,num+(i!=0),!limit);
            else            res+=dfs(len-1,num+(i!=0),limit);
        }
    }
    else
    {
        res+=dfs(len-1,num,limit);
        res+=9ll*dfs(len-1,num+1,limit);
    }
    if(!limit)        return f[len][num]=res;
    else            return res;
}

ll solve(ll x)
{
    int id=0;
    if(x==0)    return 1ll;
    while(x)    a[++id]=x%10,x/=10;
    return dfs(id,0,1);
}

int main()
{
    int T;cin>>T;
    memset(f,-1,sizeof f);
    while(T--)
    {
        ll l,r;cin>>l>>r;
        printf("%lld\n",solve(r)-solve(l-1));
    }
    return 0;
}