#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const ll maxn = 9*20;
//怎样才能记忆化, 对于12?xx 我知道此时?之前的数位和为3 但并不能确定mod,只有走完所有数位才能知道mod是多少
//对于每一个数字,他的数位和都不一定相同,即mod不一定相同,之前练习的dp有一个状态pre,是指前一个数字,
//就前一个数字相同且在limit合法的情况下就可以转移
//但现在的矛盾是mod和整个数字
//整个数字又可以不用完全写出来再取模,可以取模记录余数,那么dp数组就不会开很大,且能将状态压缩
//注意到数字和范围不大,全是9也就不超过9*18,可以枚举数字和当做mod,在mod固定的情况下设计状态进行转移
ll dp[25][maxn][maxn];//dp[i][j][k] pos为i,最高位到数位i的数字和为j,最高位到数位i时的数字取模mod后的余数
int a[25];
ll mod;
ll dfs (int pos ,ll sum,ll pre, bool limit)//Limit 1 不能最高位 sum 表示数位和j pre表示数字模mod的余数k
{
if(pos==-1) return sum==mod&&pre==0;//枚举的数字的数字和刚好等于mod且没有余数(能整除)
if(!limit&&dp[pos][sum][pre]!=-1) return dp[pos][sum][pre];
int up = limit?a[pos]:9;
ll tmp=0;
for(int i=0;i<=up;i++)
{
if(sum>mod) break;
tmp+=dfs(pos-1,sum+i,(pre*10+i)%mod,limit&&i==up);
}
if(!limit) dp[pos][sum][pre]=tmp;
return tmp;
}
ll solve(ll x) //数字12344 数位pos 43210
{
int id=0;
while(x)
{
a[id++]=x%10;
x/=10;
}
ll ans=0;
for(int i=1;i<=maxn;i++)//遍历模数
{
mod=i;
memset(dp,-1,sizeof(dp));
ans+=dfs(id-1,0,0,1);
}
return ans;
}
int main()
{
ll l,r;
cin>>l>>r;
cout<<solve(r)-solve(l-1)<<"\n";
return 0;
}