关于这道题的讲解可参考博客:
https://www.luogu.org/blog/virus2017/p4127
// luogu-judger-enable-o2
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long ll;
const int inf=0x7f7f7f7f;
ll dp[19][180][180];
int digit[20],mod;
ll dfs(int pos,ll sum,ll ori,bool limit,bool lead)
{
if(pos==-1)
{
if(sum==mod&&sum&&!ori) return 1;
return 0;
}
if(!lead&&!limit&&dp[pos][sum][ori]!=-1) return dp[pos][sum][ori];
ll ret=0;
int up= limit? digit[pos]:9;
for(int i=0;i<=up;++i)
{
int p=i;
if(!i&&lead) p=inf;
ret+=dfs(pos-1,sum+i,(ori*10+i)%mod,limit&&i==digit[pos],p==inf);
}
if(!lead&&!limit) dp[pos][sum][ori]=ret;
return ret;
}
ll solve(ll x)
{
int pos=0;
while(x)
{
digit[pos++]=x%10;
x/=10;
}
ll ans=0;
for(mod=1;mod<=pos*9;mod++)
{
memset(dp,-1,sizeof(dp));
ans+=dfs(pos-1,0,0,1,1);
}
return ans;
}
int main()
{
ll a,b;
cin>>a>>b;
cout<<solve(b)-solve(a-1)<<endl;
return 0;
}