#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int MOD = 1e9 + 7;
const int MX = 2e3;
const int M = 2e3;
void add(int& a, int b) {
a += b;
if (a >= MOD) a -= MOD;
}
int m, d;
int memo[MX][2][2][2][2][M];
string a, b;
vector<int> digit_a, digit_b;
// larger là phần prefix ở trước vị trí idx đã lớn hơn số a hay chưa
// even = 0/1: hiện tại đang ở vị trí lẻ hay chẵn
// Lưu ý các vị trí là leading zeros thì vô nghĩa
int dp(int idx, bool leading, bool larger, bool smaller, bool even, int r) {
if (idx == -1) return (r == 0);
int& ans = memo[idx][leading][larger][smaller][even][r];
if (ans != -1) return ans;
ans = 0;
int min_digit = (larger) ? 0 : digit_a[idx];
int max_digit = (smaller) ? 9 : digit_b[idx];
for (int i = min_digit; i <= max_digit; i++) {
bool new_leading = leading & (i == 0);
bool valid = true;
if (!new_leading) {
if ((even && i != d) || (!even && i == d)) valid = false;
}
if (!valid) continue;
add(ans, dp(idx - 1, new_leading, larger | (i > digit_a[idx]), smaller | (i < digit_b[idx]),
even ^ (!new_leading), (r * 10 + i) % m));
}
return ans;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> m >> d;
cin >> a;
cin >> b;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
for (int i = 0; i < a.size(); i++) digit_a.push_back(a[i] - '0');
for (int i = 0; i < b.size(); i++) digit_b.push_back(b[i] - '0');
while (digit_a.size() < digit_b.size()) digit_a.push_back(0);
memset(memo, -1, sizeof memo);
cout << dp(digit_b.size() - 1, 1, 0, 0, 0, 0) << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgpjb25zdCBpbnQgSU5GID0gMWU5OyAgCmNvbnN0IGxsIExJTkYgPSAxZTE4OyAgCgpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsgCmNvbnN0IGludCBNWCA9IDJlMzsgCmNvbnN0IGludCBNID0gMmUzOyAKCnZvaWQgYWRkKGludCYgYSwgaW50IGIpIHsKCWEgKz0gYjsgCglpZiAoYSA+PSBNT0QpIGEgLT0gTU9EOyAKfQoKaW50IG0sIGQ7IAppbnQgbWVtb1tNWF1bMl1bMl1bMl1bMl1bTV07IApzdHJpbmcgYSwgYjsgCnZlY3RvcjxpbnQ+IGRpZ2l0X2EsIGRpZ2l0X2I7IAoKLy8gbGFyZ2VyIGzDoCBwaOG6p24gcHJlZml4IOG7nyB0csaw4bubYyB24buLIHRyw60gaWR4IMSRw6MgbOG7m24gaMahbiBz4buRIGEgaGF5IGNoxrBhCi8vIGV2ZW4gPSAwLzE6IGhp4buHbiB04bqhaSDEkWFuZyDhu58gduG7iyB0csOtIGzhursgaGF5IGNo4bq1bgovLyBMxrB1IMO9IGPDoWMgduG7iyB0csOtIGzDoCBsZWFkaW5nIHplcm9zIHRow6wgdsO0IG5naMSpYQppbnQgZHAoaW50IGlkeCwgYm9vbCBsZWFkaW5nLCBib29sIGxhcmdlciwgYm9vbCBzbWFsbGVyLCBib29sIGV2ZW4sIGludCByKSB7CglpZiAoaWR4ID09IC0xKSByZXR1cm4gKHIgPT0gMCk7ICAKCglpbnQmIGFucyA9IG1lbW9baWR4XVtsZWFkaW5nXVtsYXJnZXJdW3NtYWxsZXJdW2V2ZW5dW3JdOyAKCWlmIChhbnMgIT0gLTEpIHJldHVybiBhbnM7ICAgCgoJYW5zID0gMDsgICAgCglpbnQgbWluX2RpZ2l0ID0gKGxhcmdlcikgPyAwIDogZGlnaXRfYVtpZHhdOyAKCWludCBtYXhfZGlnaXQgPSAoc21hbGxlcikgPyA5IDogZGlnaXRfYltpZHhdOyAKCQoJZm9yIChpbnQgaSA9IG1pbl9kaWdpdDsgaSA8PSBtYXhfZGlnaXQ7IGkrKykgewoJCWJvb2wgbmV3X2xlYWRpbmcgPSBsZWFkaW5nICYgKGkgPT0gMCk7IAoJCWJvb2wgdmFsaWQgPSB0cnVlOyAKCQlpZiAoIW5ld19sZWFkaW5nKSB7CgkJCWlmICgoZXZlbiAmJiBpICE9IGQpIHx8ICghZXZlbiAmJiBpID09IGQpKSB2YWxpZCA9IGZhbHNlOyAKCQl9CgkJaWYgKCF2YWxpZCkgY29udGludWU7IAoJCWFkZChhbnMsIGRwKGlkeCAtIDEsIG5ld19sZWFkaW5nLCBsYXJnZXIgfCAoaSA+IGRpZ2l0X2FbaWR4XSksIHNtYWxsZXIgfCAoaSA8IGRpZ2l0X2JbaWR4XSksIAoJCQkgICAgICAgIGV2ZW4gXiAoIW5ld19sZWFkaW5nKSwgKHIgKiAxMCArIGkpICUgbSkpOyAKCX0KCglyZXR1cm4gYW5zOyAKfQoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgIAkKCWNpbiA+PiBtID4+IGQ7IAoJY2luID4+IGE7IAoJY2luID4+IGI7IAoKCXJldmVyc2UoYS5iZWdpbigpLCBhLmVuZCgpKTsgCglyZXZlcnNlKGIuYmVnaW4oKSwgYi5lbmQoKSk7ICAgCglmb3IgKGludCBpID0gMDsgaSA8IGEuc2l6ZSgpOyBpKyspIGRpZ2l0X2EucHVzaF9iYWNrKGFbaV0gLSAnMCcpOyAgIAoJZm9yIChpbnQgaSA9IDA7IGkgPCBiLnNpemUoKTsgaSsrKSBkaWdpdF9iLnB1c2hfYmFjayhiW2ldIC0gJzAnKTsgIAoJd2hpbGUgKGRpZ2l0X2Euc2l6ZSgpIDwgZGlnaXRfYi5zaXplKCkpIGRpZ2l0X2EucHVzaF9iYWNrKDApOyAgCgkKCW1lbXNldChtZW1vLCAtMSwgc2l6ZW9mIG1lbW8pOyAgIAoKCWNvdXQgPDwgZHAoZGlnaXRfYi5zaXplKCkgLSAxLCAxLCAwLCAwLCAwLCAwKSA8PCAnXG4nOyAKfQ==