#include <bits/stdc++.h>
using namespace std;
template <class X, class Y>
void amax(X& x, const Y& y) {
  if (x < y) x = y;
}
template <class X, class Y>
void amin(X& x, const Y& y) {
  if (x > y) x = y;
}
const int INF = 1e9 + 10;
const long long INFL = 1e18 + 10;
string L, R;
int res, n, cnt;
vector<int> b;
bool has_next(vector<int>& a) {
  int p = -1, sum = 0;
  for (int i = 0; i < a.size(); i++) {
    sum += a[i];
    if (sum == n) break;
    p = i;
  }
  if (p == -1) return false;
  a[p]++;
  for (int i = p + 1; i < a.size(); i++) a[i] = 0;
  return true;
}
bool check(int pos, bool dL, bool dR) {
  if (n - pos < cnt) return false;
  if (pos == n) return true;
  int d1 = L[pos] - '0', d2 = R[pos] - '0';
  if (!dL && !dR) {
    if (L[pos] == R[pos]) {
      if (d1 == 0) return check(pos + 1, dL, dR);
      if (b[d1] == 0) return false;
      b[d1]--, cnt--;
      if (check(pos + 1, false, false))
        return true;
      else {
        b[d1]++, cnt++;
        return false;
      }
    } else {
      for (int i = d1 + 1; i < d2; i++)
        if (b[i] > 0) return true;
      if (d1 == 0 || b[d1] > 0) {
        if (d1 > 0) b[d1]--, cnt--;
        if (check(pos + 1, false, true))
          return true;
        else if (d1 > 0)
          b[d1]++, cnt++;
      }
      if (b[d2] > 0) {
        b[d2]--, cnt--;
        if (check(pos + 1, true, false))
          return true;
        else
          b[d2]++, cnt++;
      }
      return false;
    }
  } else if (dL) {
    if (d2 > 0) {
      if (n - pos - 1 >= cnt) return true;
      for (int i = 1; i < d2; i++)
        if (b[i] > 0) return true;
      if (b[d2] > 0) {
        b[d2]--, cnt--;
        if (check(pos + 1, true, false))
          return true;
        else {
          b[d2]++, cnt++;
          return false;
        }
      }
      return false;
    } else
      return check(pos + 1, true, false);
  } else {
    for (int i = d1 + 1; i < 10; i++)
      if (b[i] > 0) return true;
    if (d1 == 0 || b[d1] > 0) {
      if (d1 > 0) b[d1]--, cnt--;
      if (check(pos + 1, false, true))
        return true;
      else {
        if (d1 > 0) b[d1]++, cnt++;
        return false;
      }
    }
    return false;
  }
  return false;
}
void process() {
  long long l, r;
  cin >> l >> r;
  bool big = false;
  if (r == (long long)1e18) {
    big = true;
    r--;
  }
  if (l == (long long)1e18) {
    cout << 1;
    return;
  }
  L = to_string(l);
  R = to_string(r);
  n = R.size();
  while ((int)L.size() < n) L = "0" + L;
  vector<int> a(9);
  b.resize(10);
  while (has_next(a)) {
    b[0] = 0;
    copy(a.begin(), a.end(), b.begin() + 1);
    cnt = 0;
    for (int i = 1; i < 10; i++) cnt += b[i];
    if (check(0, false, false)) {
      res++;
      if (cnt == 1 && b[1] == 1) big = false;
    }
  }
  res += big;
  cout << res;
}
int main() {
  ios_base::sync_with_stdio(false);
  process();
}
