如题,#1 RE
洛谷ide与dev_c++可以出结果
代码可读性不一定高(
#include<bits/stdc++.h>
#define int long long
#define rint register int
using namespace std;
const int MOD=2520;
inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return f*x;
}
int t,dp[20][2601][50],y[2601];
inline int gcd(int a,int b){return b?gcd(b,a%b):a;}
inline int lcm(int a,int b){return a*b/(a>=b?gcd(a,b):gcd(b,a));}
vector<int> num;
inline void init(){
memset(dp,-1,sizeof(dp));
rint num=0;
for(rint i=1;i<=MOD;i++)if(!(MOD%i))y[i]=++num;
return;
}
inline int dfs(int x,int f,int l,int m){
if(x==-1)return f%l==0;
if((!m)&&dp[x][f][y[l]]!=-1)return dp[x][f][y[l]];
int ans=0,u=m?num[x]:9;
for(rint i=0;i<=u;i++)ans+=dfs(x-1,((f<<3)+(f<<1)+i)%MOD,i?lcm(l,i):l,m&&(i==u));
if(!m)dp[x][f][y[l]]=ans;
return ans;
}
inline int query(int a){
num.clear();
while(a){num.push_back(a%10);a/=10;}
return dfs(num.size()-1,0,1,1);
}
signed main(){
t=read();init();
while(t--){
int a=read(),b=read();
cout<<query(b)-query(a-1)<<endl;
}
return 0;
}