Description
Volodya is an odd boy and his taste is strange as well. It seems to him that a positive integer number is beautiful if and only if it is divisible by each of its nonzero digits. We will not argue with this and just count the quantity of beautiful numbers in given ranges.
Input
Multiple test cases.
Each line contains two natural numbers li and ri (1 ≤ li ≤ ri ≤ 9 · 10^18).
Output
One line specifies the answer.
Sample Input
1 9
12 15
Sample Output
9
2
一道很强的数位dp,感觉要去练下记搜了= =
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Maxn=2520;
ll l,r,c[20],idx[Maxn+5],f[20][Maxn+5][50];
ll gcd(ll a,ll b){
return !b?a:gcd(b,a%b);
}
#define lcm(a,b) a/gcd(a,b)*b
ll dp(int x,ll lef,ll lcm,bool flag){
if(!x)return lef%lcm==0;
if(!flag&&~f[x][lef][idx[lcm]])return f[x][lef][idx[lcm]];
int limit=flag?c[x]:9;
ll ret=0;
for(int i=0;i<=limit;++i){
ll Lcm=i?lcm(lcm,i):lcm;
ret+=dp(x-1,(lef*10+i)%Maxn,Lcm,flag&&i==limit);
}
if(!flag)f[x][lef][idx[lcm]]=ret;
return ret;
}
ll Solve(ll x){
for(c[0]=0;x;x/=10)c[++c[0]]=x%10;
return dp(c[0],0,1,1);
}
int main(){
for(int i=1;i<=Maxn;++i)
if(Maxn%i==0)idx[i]=++idx[0];
memset(f,-1,sizeof(f));
while(~scanf("%lld%lld",&l,&r)){
cout<<Solve(r)-Solve(l-1)<<"\n";
}
return 0;
}