#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;
}