根这道题差不多 https://blog.csdn.net/sslz_fsy/article/details/87367688
只不过关于前导0还要讨论一下
#include<bits/stdc++.h>
#define N 1505
#define LL long long
#define Mod 1000000007
using namespace std;
int ch[N][10],val[N],fail[N];
string n; int digit[N];
int m,tot; LL f[N][N][2];
void Insert(string s){
int now = 0, len = s.length();
for(int i=0;i<len;i++){
int x = s[i] - '0';
if(!ch[now][x]) ch[now][x] = ++tot;
now = ch[now][x];
} val[now] = 1;
}
void Build(){
queue<int> q;
for(int i=0;i<10;i++)
if(ch[0][i]) q.push(ch[0][i]);
while(!q.empty()){
int x = q.front(); q.pop();
for(int i=0;i<10;i++){
int j = fail[x];
if(ch[x][i]){
fail[ch[x][i]] = ch[j][i];
val[ch[x][i]] |= val[fail[ch[x][i]]];
q.push(ch[x][i]);
}
else ch[x][i] = ch[j][i];
}
}
}
LL dfs(int len,int u,int flag,int limit,int zero){
if(len==0) return (flag || zero) ? 0 : 1;
if(f[len][u][flag]!=-1 && !limit && !zero) return f[len][u][flag];
int up = limit ? digit[len] : 9; LL ret = 0;
for(int i=0;i<=up;i++){
if(len > 1 && i==0 && zero)
ret = (ret + dfs(len-1, 0, flag, limit && i==up, 1)) % Mod;
else
ret = (ret + dfs(len-1, ch[u][i], flag|val[ch[u][i]], limit && i==up, zero && i==0)) % Mod;
}
if(!limit && !zero) f[len][u][flag] = ret;
return ret;
}
LL Solve(string x){
memset(f,-1,sizeof(f));
int len = x.length();
for(int i=0;i<len;i++) digit[len-i] = x[i] - '0';
return dfs(len,0,0,1,1);
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
string s; cin>>s; Insert(s);
} Build();
printf("%lld",Solve(n)); return 0;
}