rt,第 9 个点 WA 了,少了几十万答案。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 12 + 5;
ll x, l, r, dgt[N], f[N][2][100010];
char s[20];
bool ok[N];
ll dp(int len, int op, int is0, ll mod){
if(len <= 0) return (mod ? 0 : 1);
if(!is0 && f[len][op][mod] != -1) return f[len][op][mod];
ll cnt = 0; int k = (op ? dgt[len] : 9);
for(int d=0;d<=k;d++){
if(!ok[d]) continue;
cnt += dp(len - 1, op & (d == k), is0 & (d == 0), (mod * 10LL + d) % x);
}
if(!is0) f[len][op][mod] = cnt;
return cnt;
}
ll solve(ll now){
int len = 0;
do dgt[++len] = now % 10;
while(now /= 10);
memset(f, -1, sizeof(f));
return dp(len, 1, 1, 0LL);
}
int main(){
scanf("%lld%lld%lld", &x, &l, &r);
scanf("%s", s + 1);
for(int i=1;i<=strlen(s+1);i++) ok[s[i] - '0'] = 1;
if(x <= 100000LL) return printf("%lld\n", solve(r) - solve(l - 1)), 0;
ll cnt = 0;
for(ll i=x;i<=r;i+=x){
if(i < l) continue;
ll j = i, f = 1;
while(j){
f = ok[j % 10] ? 1 : 0;
if(!f) break;
j /= 10;
}
if(f) cnt++;
}
printf("%lld\n", cnt);
return 0;
}