codeforces 55D
题意:
题解:
#include <bits\stdc++.h>
using namespace std;
typedef long long ll;
int bit[20];
ll dp[20][1<<8][2520];
ll dfs(int pos, int lcm, int num, bool limit){
if(pos == 0){
for(int i = 2 ; i <= 9 ; i++){
if(lcm&(1<<(i-2)) && num%i != 0){
return 0;
}
}
return 1;
}
if(!limit && dp[pos][lcm][num] != -1){
return dp[pos][lcm][num];
}
int up = (limit ? bit[pos] : 9);
ll res = 0;
for(int i = 0 ; i <= up ; i++){
res += dfs(pos-1, i < 2 ? lcm : (lcm|(1<<(i-2))), (num*10+i)%2520, limit && i == bit[pos]);
}
if(!limit){
dp[pos][lcm][num] = res;
}
return res;
}
ll count(ll x){
int len = 0;
while(x){
bit[++len] = x%10;
x /= 10;
}
return dfs(len, 0, 0, true);
}
int main() {
int t;
memset(dp, -1, sizeof(dp));
for(cin >> t ; t > 0 ; t--){
ll l, r;
cin >> l >> r;
cout << count(r)-count(l-1) << endl;
}
return 0;
}