#include <bits/stdc++.h>
using namespace std;
long long l, r;
int num[10], keep[10];
vector<int> lv, rv;
inline bool any(int l, int r) {
  for (int i = l; i <= r; i++) {
    if (num[i] > 0) return true;
  }
  return false;
}
bool dfs(int idx, bool lf, bool rf) {
  if (idx == rv.size()) return true;
  int l = lv[idx], r = rv[idx];
  if (lf && rf) {
    if (l == r) {
      if (num[l] > 0) {
        num[l]--;
        if (dfs(idx + 1, 1, 1)) return true;
        num[l]++;
      }
      return false;
    }
    if (any(l + 1, r - 1)) return true;
    if (num[l] > 0) {
      num[l]--;
      if (dfs(idx + 1, 1, 0)) return true;
      num[l]++;
    }
    if (num[r] > 0) {
      num[r]--;
      if (dfs(idx + 1, 0, 1)) return true;
      num[r]++;
    }
    return false;
  } else {
    if (lf) {
      if (any(l + 1, 9)) return true;
      if (num[l] > 0) {
        num[l]--;
        if (dfs(idx + 1, 1, 0)) return true;
        num[l]++;
      }
      return false;
    }
    if (rf) {
      if (any(0, r - 1)) return true;
      if (num[r] > 0) {
        num[r]--;
        if (dfs(idx + 1, 0, 1)) return true;
        num[r]++;
      }
      return false;
    }
  }
  return false;
}
int ans = 0;
void go(int idx, int rem) {
  if (idx == 10) {
    memcpy(num, keep, sizeof(keep));
    num[0] += rem;
    if (dfs(0, 1, 1)) ans++;
    return;
  }
  for (int i = 0; i <= rem; i++) {
    keep[idx] = i;
    go(idx + 1, rem - i);
  }
}
int main() {
  scanf("%lld%lld", &l, &r);
  while (l > 0) {
    lv.push_back(l % 10);
    l /= 10;
  }
  while (r > 0) {
    rv.push_back(r % 10);
    r /= 10;
  }
  while (lv.size() < rv.size()) lv.push_back(0);
  reverse(lv.begin(), lv.end());
  reverse(rv.begin(), rv.end());
  go(1, lv.size());
  printf("%d\n", ans);
}
