#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; int cnt[100]; long long dp[30][2524][50]; int dig[30]; int mod=2520; int cntt=0; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int lcm(int a,int b) { return a/gcd(a,b)*b; } long long dfs(int pos,int mo,int lcmid,int inf) { if(pos<1)return mo%cnt[lcmid]==0?1:0; if(!inf && dp[pos][mo][lcmid]!=-1)return dp[pos][mo][lcmid]; int endl=inf==1?dig[pos]:9; long long rt=0; for(int i=0;i<=endl;i++) { int lcmm; int mmo=(mo*10+i)%2520; if(i!=0)lcmm=lcm(cnt[lcmid],i); else lcmm=cnt[lcmid]; int poss=lower_bound(cnt+1,cnt+1+cntt,lcmm)-cnt; rt+=dfs(pos-1,mmo,poss,inf && i==endl); } if(!inf) dp[pos][mo][lcmid]=rt; return rt; } int main() { int t; for(int i=1;i<=2520;i++) if(2520%i==0)cnt[++cntt]=i; memset(dp,-1,sizeof(dp)); scanf("%d",&t); while(t--) { long long x,y; scanf("%I64d%I64d",&x,&y); memset(dig,0,sizeof(dig)); x--; long long ans1; long long ans2; int cc=0; while(x>0) { dig[++cc]=x%10; x/=10; } ans1=dfs(cc,0,1,1); memset(dig,0,sizeof(dig)); cc=0; while(y>0) { dig[++cc]=y%10; y/=10; } ans2=dfs(cc,0,1,1); printf("%I64d\n",ans2-ans1); } return 0; }
|