#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const int N=20+5, S=1500+10; typedef long long lint; int T, n, upnum[N]; lint x, y, f[N][S]; void Init(lint num) { n=0; while(num) { upnum[++n]=num%10; num/=10ll; } return ; } lint DP(int pos, int st, int pt, bool limit) { if(pos==0) return f[pos][st]=(st==0); if(!limit && f[pos][st]!=-1) return f[pos][st]; lint ans=0; int up= limit ? upnum[pos] : 9; for(int i=0; i<=up; i++) { if(pos>=pt) ans+=DP(pos-1, st+i*(pos-pt), pt, (limit && i==upnum[pos])); else if(st-i*(pt-pos)>=0) ans+=DP(pos-1, st-i*(pt-pos), pt, (limit && i==upnum[pos])); } if(!limit) f[pos][st]=ans; return ans; } lint Work(lint num) { if(num<10) return num+1; Init(num); lint ans=0; for(int i=1; i<=n; i++) { memset(f, -1, sizeof f); ans+=DP(n, 0, i, true); } return ans-n+1; } int main() { scanf("%d", &T); int tt=0; while(T--) { scanf("%lld%lld", &x, &y); printf("%lld\n", Work(y)-Work(x-1)); } return 0; }
|