作者:
炽热的
,
2023-03-15 22:45:05
,
所有人可见
,
阅读 42
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long i64;
int len;
int nums[20];
int mp[2530], val[60], idx;
i64 f[20][2530][60];
int __lcm(int a, int b) {
return a * b / __gcd(a, b);
}
i64 dfs(int pos, int Mod, int lcm, int limit) {
if (!pos) return Mod % val[lcm] == 0;
if (!limit && ~f[pos][Mod][lcm]) return f[pos][Mod][lcm];
int up = limit ? nums[pos] : 9;
i64 res = 0;
for (int i = 0; i <= up; i ++ )
res += dfs(pos - 1, (Mod * 10 + i) % 2520, i ? mp[__lcm(val[lcm], i)] : lcm, limit && i == up);
return limit ? res : f[pos][Mod][lcm] = res;
}
i64 calc(i64 x) {
len = 0;
while (x) nums[ ++ len] = x % 10, x /= 10;
return dfs(len, 0, 1, 1);
}
void solve() {
i64 l, r;
cin >> l >> r;
cout << calc(r) - calc(l - 1) << endl;
}
int main() {
memset(f, -1, sizeof f);
for (int i = 1; i <= 2520; i ++ )
if (2520 % i == 0)
mp[i] = ++ idx, val[idx] = i;
int _; cin >> _;
while (_ -- ) solve();
return 0;
}