本地 2s 过了,放 CF 上四秒跑不过 :(
#include <bits/stdc++.h>
#define endl '\n'
typedef long long ll;
using namespace std;
inline ll read()
{
ll f = 1, sum = 0; char c = getchar();
while (!(48 <= c && c <= 57)) { if (c == '-') f = -1; c = getchar();}
while (48 <= c && c <= 57){sum = sum * 10 + c - 48; c = getchar();}
return sum * f;
}
inline void write(ll x)
{
if (x < 0) putchar('-'), x = -x;
if (x > 9) write(x / 10); putchar(x % 10 + 48);
}
int ys2[2521];
vector<int> arr;
ll dp[20][50][2521];
ll gcd(ll a, ll b)
{
if (a % b == 0) return b;
return gcd(b, a % b);
}
ll calc_lcm(ll a, ll b)
{
if (!b) return a;
if (!a) return b;
return a / gcd(a, b) * b;
}
ll dfs(ll pos, int lcm, ll mod, bool flag2)
{
if (pos == 0) return mod % lcm == 0;
if (!flag2 && dp[pos][ys2[lcm]][mod]) return dp[pos][ys2[lcm]][mod];
int r = flag2 ? arr[pos] : 9;
ll tot = 0;
for (int i = 0; i <= r; i++)
{
tot += dfs(pos - 1, calc_lcm(lcm, i), (mod * 10 + i) % 2520, flag2 && (i == r));
}
if (!flag2) dp[pos][ys2[lcm]][mod] = tot;
return tot;
}
ll solve(ll k)
{
arr.clear();
arr.push_back(-1);
while (k) arr.push_back(k % 10), k /= 10;
return dfs(arr.size() - 1, 1, 0, 1);
}
int main()
{
int t;
cin >> t;
int cur = 0;
for (int i = 1; i <= 2520; i++)
{
if (2520 % i == 0)
{
ys2[i] = ++cur;
}
}
while (t--)
{
ll l, r;
cin >> l >> r;
cout << solve(r) - solve(l - 1) << endl;
}
return 0;
}