#include <bits/stdc++.h>
using namespace std;
long long L, R;
int ans, N1, N2, arr[20], D1[20], D2[20];
inline int calc(long long n, int D[]) {
  int ret = 0;
  while (n) D[++ret] = n % 10, n /= 10;
  reverse(D + 1, D + ret + 1);
  return ret;
}
inline bool can(int now, int n, int sgn, int num[]) {
  if (now > n) return true;
  if (sgn == 3) return true;
  if (!sgn) {
    for (int i = D1[now] + 1; i < D2[now]; ++i) {
      if (!num[i]) continue;
      return true;
    }
    if (D1[now] == D2[now]) {
      if (num[D1[now]]) {
        num[D1[now]]--;
        if (can(now + 1, n, sgn, num)) return true;
        num[D1[now]]++;
      }
      return false;
    } else {
      if (num[D1[now]]) {
        num[D1[now]]--;
        if (can(now + 1, n, 1, num)) return true;
        num[D1[now]]++;
      }
      if (num[D2[now]]) {
        num[D2[now]]--;
        if (can(now + 1, n, 2, num)) return true;
        num[D2[now]]++;
      }
      return false;
    }
  } else if (sgn == 1) {
    for (int i = D1[now] + 1; i <= 9; ++i) {
      if (!num[i]) continue;
      return true;
    }
    if (num[D1[now]]) {
      num[D1[now]]--;
      if (can(now + 1, n, sgn, num)) return true;
      num[D1[now]]++;
    }
    return false;
  } else {
    for (int i = D2[now] - 1; i >= 0; --i) {
      if (!num[i]) continue;
      return true;
    }
    if (num[D2[now]]) {
      num[D2[now]]--;
      if (can(now + 1, n, sgn, num)) return true;
      num[D2[now]]++;
    }
    return false;
  }
  return false;
}
inline bool check(int n) {
  if (N1 < N2 - 1 && n != N2) return true;
  int num[10] = {0};
  for (int i = 1; i <= n; ++i) num[arr[i]]++;
  if (N1 == N2) {
    num[0] = N1 - n;
    return can(1, N1, 0, num);
  } else {
    bool ret = false;
    int bac[20], tmp;
    if (n <= N1) {
      memset(num, 0, sizeof num);
      for (int i = 1; i <= n; ++i) num[arr[i]]++;
      num[0] = N1 - n;
      memcpy(bac, D2, sizeof D2);
      for (int i = 1; i <= N1; ++i) D2[i] = 9;
      tmp = N2;
      N2 = N1;
      ret = can(1, n, 0, num);
      memcpy(D2, bac, sizeof D2);
      N2 = tmp;
    }
    if (!ret) {
      memset(num, 0, sizeof num);
      for (int i = 1; i <= n; ++i) num[arr[i]]++;
      num[0] = N2 - n;
      memcpy(bac, D1, sizeof D1);
      for (int i = 1; i <= N2; ++i) D1[i] = 1;
      tmp = N1;
      N1 = N2;
      bool sgn = true;
      for (int i = 1; i <= N2; ++i) {
        if (D1[i] < D2[i])
          break;
        else if (D1[i] > D2[i]) {
          sgn = false;
          break;
        }
      }
      if (sgn) ret = can(1, n, 0, num);
      memcpy(D1, bac, sizeof D1);
      N1 = tmp;
    }
    return ret;
  }
}
inline void dfs(int now, int last) {
  if (now > 1)
    if (check(now - 1)) ++ans;
  if (now > N2) return;
  for (int i = last; i <= 9; ++i) arr[now] = i, dfs(now + 1, i);
}
int main() {
  cin >> L >> R;
  N1 = calc(L, D1);
  N2 = calc(R, D2);
  dfs(1, 1);
  cout << ans << endl;
  fclose(stdin);
  fclose(stdout);
  return 0;
}
