#include <bits/stdc++.h>
using namespace std;
vector<int> L, R;
int n, ans, keep[20], num[20];
bool any(int l, int r) {
  for (int i = l; i <= r; ++i)
    if (num[i]) return true;
  return false;
}
bool check(int pos, int fl, int fr) {
  if (pos == n) return true;
  if (fl == 1 && fr == 1) {
    if (L[pos] == R[pos]) {
      if (num[L[pos]]) {
        --num[L[pos]];
        if (check(pos + 1, 1, 1)) return true;
        ++num[L[pos]];
      }
      return false;
    }
    if (any(L[pos] + 1, R[pos] - 1)) return true;
    if (num[L[pos]]) {
      --num[L[pos]];
      if (check(pos + 1, 1, 0)) return true;
      ++num[L[pos]];
    }
    if (num[R[pos]]) {
      --num[R[pos]];
      if (check(pos + 1, 0, 1)) return true;
      ++num[R[pos]];
    }
    return false;
  }
  if (fl == 1) {
    if (any(L[pos] + 1, 9)) return true;
    if (num[L[pos]]) {
      --num[L[pos]];
      if (check(pos + 1, 1, 0)) return true;
      ++num[L[pos]];
    }
    return false;
  } else if (fr == 1) {
    if (any(0, R[pos] - 1)) return true;
    if (num[R[pos]]) {
      --num[R[pos]];
      if (check(pos + 1, 0, 1)) return true;
      ++num[R[pos]];
    }
    return false;
  }
}
void go(int n, int sum) {
  if (n == 10) {
    memcpy(num, keep, sizeof(keep));
    num[0] += sum;
    if (check(0, 1, 1)) ++ans;
    return;
  }
  for (int i = 0; i <= sum; ++i) {
    keep[n] = i;
    go(n + 1, sum - i);
  }
}
int main() {
  long long l, r;
  scanf("%I64d%I64d", &l, &r);
  while (r) {
    R.push_back(r % 10);
    r /= 10;
  }
  while (l) {
    L.push_back(l % 10);
    l /= 10;
  }
  n = R.size();
  while (L.size() < n) L.push_back(0);
  reverse(L.begin(), L.end());
  reverse(R.begin(), R.end());
  go(1, n);
  printf("%d\n", ans);
}
