#include <bits/stdc++.h>   using namespace std;   const double pi = acos(0.0) * 2.0;   const double eps = 1e-12;   const int step[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};   template <class T>   inline T abs1(T a) {     return a < 0 ? -a : a;   }   template <class T>   inline T max1(T a, T b, T c = -1234567, T d = -1234567) {     T ans = a > b ? a : b;     if (c != -1234567) ans = max1(ans, c);     if (d != -1234567) ans = max1(ans, d);     return ans;   }   template <class T>   inline T min1(T a, T b, T c = -1234567, T d = -1234567) {     T ans = a < b ? a : b;     if (c != -1234567) ans = min(ans, c);     if (d != -1234567) ans = min(ans, d);     return ans;   }   template <class T>   inline T gcd1(T a, T b) {     if (a < b) swap(a, b);     if (a % b == 0) return b;     return gcd1(b, a % b);   }   template <class T>   inline T lb(T num) {     return num & (-num);   }   inline int jud(double a, double b) {     if (abs1(a - b) < eps) return 0;     if (a < b) return -1;     return 1;   }   template <typename it, typename t1>   inline int find(t1 val, it a, int na, bool f_small = 1, bool f_lb = 1) {     if (na == 1) return 0;     int be = 0, en = na - 1;     if (*a <= *(a + na - 1)) {       if (f_lb == 0)         while (be < en) {           int mid = (be + en + 1) / 2;           if (jud(*(a + mid), val) != 1)             be = mid;           else             en = mid - 1;         }       else         while (be < en) {           int mid = (be + en) / 2;           if (jud(*(a + mid), val) != -1)             en = mid;           else             be = mid + 1;         }       if (f_small && jud(*(a + be), val) == 1 && be != 0) be--;       if (!f_small && jud(*(a + be), val) == -1 && be != na - 1) be++;     } else {       if (f_lb)         while (be < en) {           int mid = (be + en + 1) / 2;           if (jud(*(a + mid), val) != -1)             be = mid;           else             en = mid - 1;         }       else         while (be < en) {           int mid = (be + en) / 2;           if (jud(*(a + mid), val) != 1)             en = mid;           else             be = mid + 1;         }       if (!f_small && jud(*(a + be), val) == -1 && be != 0) be--;       if (f_small && jud(*(a + be), val) == 1 && be != na - 1) be++;     }     return be;   }   inline int bitnum(unsigned long long nValue) {     nValue = ((0xaaaaaaaaaaaaaaaaull & nValue) >> 1) +              (0x5555555555555555ull & nValue);     nValue = ((0xccccccccccccccccull & nValue) >> 2) +              (0x3333333333333333ull & nValue);     nValue = ((0xf0f0f0f0f0f0f0f0ull & nValue) >> 4) +              (0x0f0f0f0f0f0f0f0full & nValue);     nValue = ((0xff00ff00ff00ff00ull & nValue) >> 8) +              (0x00ff00ff00ff00ffull & nValue);     nValue = ((0xffff0000ffff0000ull & nValue) >> 16) +              (0x0000ffff0000ffffull & nValue);     nValue = ((0xffffffff00000000ull & nValue) >> 32) +              (0x00000000ffffffffull & nValue);     return nValue;   }   long long pow(long long n, long long m, long long mod = 0) {     long long ans = 1;     long long k = n;     while (m) {       if (m & 1) {         ans *= k;         if (mod) ans %= mod;       }       k *= k;       if (mod) k %= mod;       m >>= 1;     }     return ans;   }   const int maxn = 200110;   char str[maxn];   int f[maxn];   int cntwen = 0, cnt = 0, st1 = 0;   int main() {     scanf( %s , str);     int l = strlen(str);     bool st = (str[0] >=  A  && str[0] <=  J );     for (int i = 0; i < l; i++) {       if (str[i] >=  A  && str[i] <=  J ) {         if (f[str[i] -  A ] == 0) cnt++;         f[str[i] -  A ]++;       }       if (str[i] ==  ? ) cntwen++;     }     int ans = 1;     for (int i = 0; i < cnt; i++) ans *= 10 - i;     if (st) {       ans /= 10;       ans *= 9;     }     if (str[0] ==  ? ) ans *= 9, cntwen--;     printf( %d , ans);     for (int i = 0; i < cntwen; i++) printf( 0 );     printf(  n );     return 0;   }