#include <bits/stdc++.h>
using namespace std;
char a[] = "01+-*()=";
int pr[500];
char s[100];
char t[100];
int n, ans;
map<char, char> m;
bool work(stack<long long> &res, stack<char> &op) {
  if (res.empty()) return 0;
  if (res.top() == '(') return 0;
  if (op.top() == '#') {
    res.top() = -res.top();
    op.pop();
    return 1;
  }
  long long tem = res.top();
  res.pop();
  if (res.empty()) return 0;
  if (op.top() == '+') {
    res.top() += tem;
  } else if (op.top() == '-') {
    res.top() -= tem;
  } else {
    res.top() *= tem;
  }
  op.pop();
  return 1;
}
pair<long long, bool> get(int l, int r) {
  if (l >= r) return make_pair(0, 0);
  if (t[l] == '+' || t[l] == '*' || t[l] == ')') return (make_pair(0, 0));
  if (t[r - 1] == '+' || t[r - 1] == '*' || t[r - 1] == '(' || t[r - 1] == '-')
    return (make_pair(0, 0));
  stack<long long> res;
  stack<char> op;
  for (int i = l; i < r; ++i) {
    if (isdigit(t[i])) {
      long long tem = 0;
      int st = i;
      while (i < r && isdigit(t[i])) {
        tem = tem * 2 + t[i] - '0';
        i++;
      }
      if (st + 1 < i && t[st] == '0') return (make_pair(0, 0));
      res.push(tem);
      i--;
      continue;
    }
    if (t[i] == '(') {
      op.push('(');
      if (i > l && (isdigit(t[i - 1]) || t[i - 1] == ')'))
        return (make_pair(0, 0));
      if (i < r - 1 &&
          !(isdigit(t[i + 1]) || t[i + 1] == '(' || t[i + 1] == '#'))
        return (make_pair(0, 0));
      continue;
    }
    if (t[i] == ')') {
      if (i > l && !(isdigit(t[i - 1]) || t[i - 1] == ')'))
        return (make_pair(0, 0));
      if (i < r - 1 && (isdigit(t[i + 1] || t[i + 1] == '(')))
        return (make_pair(0, 0));
      while (op.empty() == false && op.top() != '(') {
        bool flag = work(res, op);
        if (flag == 0) return (make_pair(0, 0));
      }
      if (op.empty() == true) return (make_pair(0, 0));
      op.pop();
      continue;
    }
    while (op.empty() == false && pr[op.top()] >= pr[t[i]]) {
      bool flag = work(res, op);
      if (flag == 0) return (make_pair(0, 0));
    }
    op.push(t[i]);
  }
  while (!op.empty()) {
    bool flag = work(res, op);
    if (flag == 0) return (make_pair(0, 0));
  }
  if (res.size() == 1) return make_pair(res.top(), 1);
  return (make_pair(0, 0));
}
bool check() {
  for (int i = 0; i < n; ++i) {
    if (isalpha(s[i])) {
      t[i] = m[s[i]];
    } else {
      t[i] = s[i];
    }
  }
  int n = ::n;
  for (int i = 0; i < n; ++i) {
    if (t[i] != '-') continue;
    if (i && (t[i - 1] == ')' || isdigit(t[i - 1]))) {
      continue;
    }
    t[i] = '#';
  }
  for (int i = 1; i < n; ++i) {
    if (t[i - 1] == '#' && t[i] == '#') {
      for (int j = i + 1; j < n; ++j) {
        t[j - 2] = t[j];
      }
      n -= 2;
      i--;
    }
  }
  if (t[0] == '=' || t[n - 1] == '=') return 0;
  int equal = 0, pos = -1;
  for (int i = 0; i < n; ++i) {
    if (t[i] == '=') {
      equal++;
      pos = i;
    }
  }
  if (equal != 1) return 0;
  pair<long long, bool> left = get(0, pos);
  if (left.second == false) return 0;
  pair<long long, bool> righ = get(pos + 1, n);
  if (righ.second == false) return 0;
  return left == righ;
}
void dfs(int o) {
  if (o == n) {
    ans += check();
    return;
  }
  if (isalpha(s[o])) {
    if (m.find(s[o]) != m.end()) {
      dfs(o + 1);
    } else {
      for (int i = 0; i < 8; ++i) {
        if (m.find(a[i]) != m.end()) continue;
        m[s[o]] = a[i];
        m[a[i]] = s[o];
        dfs(o + 1);
        m.erase(s[o]);
        m.erase(a[i]);
      }
    }
  } else {
    t[o] = s[o];
    dfs(o + 1);
  }
}
int main() {
  pr['('] = -1;
  pr['*'] = 1;
  pr['+'] = 0;
  pr['-'] = 0;
  pr[')'] = -1;
  pr['#'] = 3;
  scanf("%s", s);
  n = int(strlen(s));
  dfs(0);
  cout << ans << endl;
  return 0;
}
