一道比较简单的数位dp题,
f[i][j]
f
[
i
]
[
j
]
中
i
i
表示数字的位数表示之前数字在
(modmo)
(
mod
m
o
)
下的和
dfs中,
o
o
表示前几位是否都取了可取的最大值(如果是,那么当前位的最大只能取到当前为的数字,否则可以取到)
#include<bits/stdc++.h>
#define ll long long
#define il inline
using namespace std;
ll f[11][105],nb[11];
int a,b,mo,l1,l2,s1,s2;
il int gl(int x){memset(nb,0,sizeof nb);int r=0;for(;x;nb[++r]=x%10,x/=10);return r;}
il int dfs(int x,int s,bool o){
if(x==0) return s==0;
if(!o&&f[x][s]!=-1) return f[x][s];
int res=0,r=o?nb[x]:9;
for(int i=0;i<=r;++i) res+=dfs(x-1,(s+i)%mo,o&&i==r);
if(!o) f[x][s]=res;
return res;
}
int main(){
while(~scanf("%d%d%d",&a,&b,&mo)){
memset(f,-1,sizeof(f));
l1=gl(a-1),s1=dfs(l1,0,1),l2=gl(b),s2=dfs(l2,0,1);
printf("%d\n",s2-s1);
}
return 0;
}