#include <bits/stdc++.h>
using namespace std;
long long pascal[100][100];
void preprocess() {
  for (int n = 0; (n) < int(100); (n)++)
    for (int k = 0; (k) < int(100); (k)++) {
      if (k > n)
        pascal[n][k] = 0;
      else if (k == 0 || k == n)
        pascal[n][k] = 1;
      else
        pascal[n][k] = pascal[n - 1][k] + pascal[n - 1][k - 1];
    }
}
struct state {
  int cnt[10];
};
long long getaux(state s) {
  long long ans = 1;
  int sum = 0;
  for (int k = 0; (k) < int(10); (k)++) sum += s.cnt[k];
  for (int k = 0; (k) < int(10); (k)++) {
    ans *= pascal[sum][s.cnt[k]];
    sum -= s.cnt[k];
  }
  return ans;
}
long long get(state s) {
  long long ans = 0;
  for (int k = 1; (k) <= int(9); (k)++) {
    if (s.cnt[k] == 0) continue;
    s.cnt[k]--;
    ans += getaux(s);
    s.cnt[k]++;
  }
  return ans;
}
long long ans = 0;
void bt(int k, int cnt[], state& s) {
  if (k == 10) {
    ans += get(s);
    return;
  }
  if (cnt[k] == 0) {
    s.cnt[k] = 0;
    bt(k + 1, cnt, s);
  } else
    for (int i = 1; (i) <= int(cnt[k]); (i)++) {
      s.cnt[k] = i;
      bt(k + 1, cnt, s);
    }
}
int main() {
  preprocess();
  long long n;
  scanf("%lld", &n);
  int cnt[10];
  state s;
  memset(&cnt, (0), sizeof(cnt));
  ;
  memset(&s.cnt, (0), sizeof(s.cnt));
  ;
  while (n > 0) {
    cnt[n % 10]++;
    n /= 10;
  }
  bt(0, cnt, s);
  printf("%lld\n", ans);
  return 0;
}
