题意:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d60eeedd5c40da888f7ac5286806cb03.png)
解法:
令d[len][md][f]表示:
当前长度为len,数模m=md,当前数位奇偶性为f,的合法方案数.
数位dp一下即可.
code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=2e3+5;
const int mod=1e9+7;
char l[maxm],r[maxm];
int digit[maxm];
int dp[maxm][maxm][2];
int m,d;
int len;
int dfs(int len,int limit,int md,int f,int pre){
if(!len)return md==0;
if(!limit&&!pre&&dp[len][md][f]!=-1)return dp[len][md][f];
int ma=(limit?digit[len]:9);
int ans=0;
if(f==0){
if(d<=ma){
ans+=dfs(len-1,limit&&d==ma,(md*10+d)%m,f^1,0);
}
}else{
for(int i=0;i<=ma;i++){
if(i==d)continue;
if(pre&&i==0){
ans+=dfs(len-1,limit&&i==ma,(md*10+i)%m,1,1);
}else{
ans+=dfs(len-1,limit&&i==ma,(md*10+i)%m,f^1,0);
}
ans%=mod;
}
}
if(!limit&&!pre)dp[len][md][f]=ans;
return ans;
}
int solve(char *p){
for(int i=1;i<=len;i++){
digit[i]=p[i];
}
return dfs(len,1,0,1,1);
}
signed main(){
memset(dp,-1,sizeof dp);
cin>>m>>d>>(l+1)>>(r+1);
len=strlen(l+1);
for(int i=1;i<=len;i++){
l[i]-='0';
r[i]-='0';
}
reverse(l+1,l+1+len);
reverse(r+1,r+1+len);
l[1]--;
for(int i=1;i<=len;i++){
if(l[i]<0){
l[i]+=10,l[i+1]--;
}else break;
}
int ans=(solve(r)-solve(l)+mod)%mod;
cout<<ans<<endl;
return 0;
}