#include <bits/stdc++.h>
using namespace std;
struct Number {
  char cnt[10];
  char len;
  Number() {
    memset(cnt, 0, sizeof(cnt));
    len = 0;
  }
};
vector<Number> numbers;
void rec(Number& n, int d, int len) {
  if (d == 10) {
    if (len == 0) {
      return;
    }
    n.len = len;
    numbers.push_back(n);
    return;
  }
  for (int c = 0; c + len <= 18; ++c) {
    n.cnt[d] = c;
    rec(n, d + 1, len + c);
  }
}
vector<int> disperse(long long n) {
  vector<int> ans;
  while (n) {
    ans.push_back(n % 10);
    n /= 10;
  }
  reverse((ans).begin(), (ans).end());
  return ans;
}
bool smallestIsLeq(Number n, bool can, const vector<int>& vct, int pos) {
  if (!can) {
    bool put = false;
    for (int i = 1; i < 10; ++i) {
      if (n.cnt[i]) {
        --n.cnt[i];
        put = true;
        if (i < vct[pos]) {
          return true;
        }
        if (i > vct[pos]) {
          return false;
        }
        ++pos;
        break;
      }
    }
    if (!put) {
      return false;
    }
  }
  for (int i = 0; i < 10; ++i) {
    while (n.cnt[i]--) {
      if (i < vct[pos]) {
        return true;
      }
      if (i > vct[pos]) {
        return false;
      }
      ++pos;
    }
  }
  return true;
}
bool greatestIsGeq(Number n, const vector<int>& vct, int pos) {
  for (int i = 9; i >= 0; --i) {
    while (n.cnt[i]--) {
      if (i > vct[pos]) {
        return true;
      }
      if (i < vct[pos]) {
        return false;
      }
      ++pos;
    }
  }
  return true;
}
bool solve(const vector<int>& a, const vector<int>& b, Number n) {
  for (int i = 0; i < (int)(a).size(); ++i) {
    for (int j = a[i] + 1; j < b[i]; ++j) {
      if (n.cnt[j]) {
        return true;
      }
    }
    if (a[i] == b[i]) {
      if (!n.cnt[a[i]]) {
        return false;
      }
      --n.cnt[a[i]];
      continue;
    }
    if (n.cnt[a[i]]) {
      Number x = n;
      --x.cnt[a[i]];
      if (greatestIsGeq(x, a, i + 1)) {
        return true;
      }
    }
    if (n.cnt[b[i]]) {
      Number x = n;
      --x.cnt[b[i]];
      if (smallestIsLeq(x, true, b, i + 1)) {
        return true;
      }
    }
    return false;
  }
  return true;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  Number tmp;
  rec(tmp, 1, 0);
  int ans = 0;
  long long lf, rg;
  cin >> lf >> rg;
  vector<int> a = disperse(lf), b = disperse(rg);
  for (Number n : numbers) {
    if (n.len > (int)(b).size()) {
      continue;
    }
    while (n.len < (int)(a).size()) {
      ++n.cnt[0];
      ++n.len;
    }
    if ((int)(a).size() + 1 < (int)(b).size() && n.len < (int)(b).size()) {
      ++ans;
      continue;
    }
    if ((int)(a).size() + 1 == (int)(b).size()) {
      if (n.len == (int)(a).size()) {
        if (greatestIsGeq(n, a, 0)) {
          ++ans;
          continue;
        }
        ++n.cnt[0];
        ++n.len;
        if (smallestIsLeq(n, false, b, 0)) {
          ++ans;
          continue;
        }
        continue;
      }
      assert(n.len == (int)(b).size());
      if (smallestIsLeq(n, false, b, 0)) {
        ++ans;
        continue;
      }
      continue;
    }
    if ((int)(a).size() != (int)(b).size()) {
      assert(n.len == (int)(b).size());
      if (smallestIsLeq(n, false, b, 0)) {
        ++ans;
        continue;
      }
      continue;
    }
    assert(n.len == (int)(a).size());
    if (solve(a, b, n)) {
      ++ans;
    }
  }
  cout << ans << "\n";
}
