数位dp
我们需要定义一个全局变量MOD,存储余数,然后在dfs时记录前面数字的和,然后到最后一层后判断是不是整除即模数等于零
代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lli long long int
using namespace std;
lli f[20][201][201],a[21],MOD;
inline lli dfs(int p,int sum,int mo,bool jud)
{
if (!p) return (mo==0&&sum==MOD);
if (!jud&&f[p][sum][mo]!=-1) return f[p][sum][mo];
int emm=jud?a[p]:9;
lli ans=0;
for (int i=0;i<=emm;i++)
ans+=dfs(p-1,sum+i,(mo*10+i)%MOD,jud&&emm==i);
if (!jud) f[p][sum][mo]=ans;
return ans;
}
lli slove(lli x,lli y)
{
int len=0;
while (x) a[++len]=x%10,x/=10;
lli ans=0;
for (MOD=1;MOD<=len*9;MOD++)
memset(f,-1,sizeof(f)),ans+=dfs(len,0,0,1);
int lon=0;
while (y) a[++lon]=y%10,y/=10;
lli que=0;
for (MOD=1;MOD<=lon*9;MOD++)
memset(f,-1,sizeof(f)),que+=dfs(lon,0,0,1);
return ans-que;
}
int main()
{
lli l,r;cin>>l>>r;
cout<<slove(r,l-1);
return 0;
}