#include <bits/stdc++.h>
using namespace std;
enum Order { DEC, EQL, INC };
const vector<int> vec(const string& s) {
  vector<int> res;
  for (const auto& c : s) res.insert(begin(res), c - '0');
  return res;
}
int remain(int n, int d, int M) {
  static vector<int> base = {1};
  while (base.size() <= d) base.push_back((base.back() * 10) % M);
  return (n * base[d]) % M;
}
int rec(const vector<int>& n, int M,
        map<tuple<int, int, int, Order, bool>, int>& memo, int d, int i, int r,
        Order ord, bool eql) {
  tuple<int, int, int, Order, bool> m(d, i, r, ord, eql);
  if (memo.count(m)) return memo[m];
  if (!d) return !r;
  int res = 0;
  if (eql) {
    if (ord == INC && i > n[d - 1])
      res += rec(n, M, memo, d - 1, n[d - 1],
                 (r + remain(n[d - 1], d - 1, M)) % M, DEC, true);
    if (ord == DEC && i < n[d - 1])
      res += rec(n, M, memo, d - 1, n[d - 1],
                 (r + remain(n[d - 1], d - 1, M)) % M, INC, true);
    for (int j = 0; j < n[d - 1]; ++j) {
      if (ord == INC && i > j)
        res += rec(n, M, memo, d - 1, j, (r + remain(j, d - 1, M)) % M, DEC,
                   false);
      if (ord == DEC && i < j)
        res += rec(n, M, memo, d - 1, j, (r + remain(j, d - 1, M)) % M, INC,
                   false);
    }
  } else {
    if (ord == EQL) {
      res += rec(n, M, memo, d - 1, 0, r, EQL, false);
      for (int j = 1; j < 10; ++j) {
        res += rec(n, M, memo, d - 1, j, (r + remain(j, d - 1, M)) % M, DEC,
                   false);
        res += rec(n, M, memo, d - 1, j, (r + remain(j, d - 1, M)) % M, INC,
                   false);
      }
    } else {
      for (int j = 0; j < 10; ++j) {
        if (ord == INC && i > j)
          res += rec(n, M, memo, d - 1, j, (r + remain(j, d - 1, M)) % M, DEC,
                     false);
        if (ord == DEC && i < j)
          res += rec(n, M, memo, d - 1, j, (r + remain(j, d - 1, M)) % M, INC,
                     false);
      }
    }
  }
  return memo[m] = (res % 10000);
}
int count(const string& s, int M) {
  map<tuple<int, int, int, Order, bool>, int> memo;
  auto n = vec(s);
  int res = 0;
  int d = n.size() - 1;
  res += rec(n, M, memo, d, n[d], remain(n[d], d, M), INC, true);
  res += rec(n, M, memo, d, n[d], remain(n[d], d, M), DEC, true);
  res += rec(n, M, memo, d, 0, 0, EQL, false);
  for (int i = 1; i < n[d]; ++i) {
    res += rec(n, M, memo, d, i, remain(i, d, M), INC, false);
    res += rec(n, M, memo, d, i, remain(i, d, M), DEC, false);
  }
  return res % 10000;
}
int main() {
  string A, B;
  int M;
  cin >> A >> B >> M;
  cout << count(B, M) - count(A, M) << endl;
}
