#include <bits/stdc++.h>
using namespace std;
const long long INF = (long long)1e18;
const int inf = (int)1e9;
const int mod = (int)1e9 + 7;
const int maxn = (int)1e6 + 10;
const double eps = (int)1e-9;
vector<int> get_ciphers(long long x) {
  vector<int> res;
  while (x) {
    res.push_back(x % 10);
    x /= 10;
  }
  reverse(res.begin(), res.end());
  return res;
}
int ans, cipher[20], cnt[20];
long long L, R;
vector<int> __left, __right;
int get_cnt(int l, int r) {
  int res = 0;
  for (int i = l; i <= r; ++i) res += cnt[i];
  return res;
}
bool go(int pos, int lp, int rp) {
  if (pos >= __left.size() || (!lp && !rp)) return true;
  int up = rp ? __right[pos] : 9;
  int down = lp ? __left[pos] : 0;
  for (int i = down; i <= up; ++i) {
    if (cnt[i]) {
      --cnt[i];
      if (go(pos + 1, lp && i == down, rp && i == up)) return true;
      ++cnt[i];
    }
  }
  return false;
}
void rec(int v, int c) {
  if (v == (int)__left.size()) {
    for (int i = 0; i < 10; ++i) cnt[i] = 0;
    for (int i = 0; i < v; ++i) cnt[cipher[i]]++;
    if (go(0, 1, 1)) ++ans;
    return;
  }
  for (int i = c; i < 10; ++i) {
    cipher[v] = i;
    rec(v + 1, i);
  }
  return;
}
int main() {
  cin >> L >> R;
  __left = get_ciphers(L);
  __right = get_ciphers(R);
  while (__left.size() < __right.size()) {
    __left.push_back(0);
    for (int i = (int)__left.size() - 1; i > 0; --i)
      swap(__left[i], __left[i - 1]);
  }
  rec(0, 0);
  cout << ans << endl;
  return 0;
}
