#include <cstdio>#include <iostream>#include <cstring>#include <string>#include <map>#include <limits>#include <algorithm>using namespace std;const int maxn = 20000;struct bign{ int len, s[maxn]; bign(){memset(s, 0, sizeof(s)); len = 1;} bign(int num){*this = num;} bign(char *num){*this = num;} bign operator = (const char* num){ len = strlen(num); for(int i = 0; i < len; i++) s[i] = num[len - i - 1] - '0';//反转 return *this; } bign operator = (const int num){ char s[maxn]; sprintf(s, "%d", num); *this = s; return *this; } string str() const { string res = ""; for(int i = 0; i < len; i++) res = (char)(s[i] + '0') + res; if(res == "") res = "0"; return res; } bign operator + (const bign & b) const { bign c; c.len = 0; for(int i = 0, g = 0; g || i < max(len, b.len); i++){// g 只判断最后是否进位 int x = g; if(i < len) x += s[i]; if(i < b.len) x += b.s[i]; c.s[c.len++] = x % 10; g = x / 10; } return c; } bign operator += (const bign & b) { *this = *this + b; return *this; } void clean(){ while(len > 1 && !s[len - 1]) len--; } bign operator - (const bign & b){ bign c; c.len = 0; for(int i = 0, g = 0; i < len; i++){ int x = s[i] - g; if(i < b.len) x -= b.s[i]; if(x >= 0) g = 0; else {g = 1; x += 10;} c.s[c.len++] = x; } c.clean(); return c; } bign operator -= (const bign & b){ *this = *this - b; return *this; } bign operator * (const bign &b){ bign c; c.len = len + b.len; for(int i = 0; i < len; i++) for(int j = 0; j < b.len; j++) c.s[i + j] += s[i] * b.s[j]; for(int i = 0; i < c.len - 1; i++){ c.s[i + 1] += c.s[i] / 10; c.s[i] %= 10; } c.clean(); return c; } void digit_shift(bign & n, int d) { int i; if(n == 0) return; for(i = n.len - 1; i >= 0; i--) n.s[i + d] = n.s[i]; for(i = 0; i < d; i++) n.s[i] = 0; n.len = n.len + d; } bign operator / (const bign& b){ bign row; bign c; c.len = len; int i, j; for(i = len - 1; i >= 0; i--){ digit_shift(row, 1); row += s[i]; c.s[i] = 0; while(row >= b){ c.s[i]++; row -= b; } } c.clean(); return c; } bool operator < (const bign & b) const{ if(len != b.len) return len < b.len; for(int i = len - 1;i >= 0; i--) if(s[i] != b.s[i]) return s[i] < b.s[i]; return false; } bool operator > (const bign & b) const { return b < *this;} bool operator <= (const bign & b) const {return !(b < *this);} bool operator >= (const bign & b) const {return !(*this < b);} bool operator != (const bign & b) const {return b < *this || *this < b;} bool operator == (const bign & b) const {return !(b < *this) && !(*this < b);}};istream & operator >> (istream & in, bign & x){ string s; in>>s; x = s.c_str(); return in;}ostream & operator << (ostream & out, const bign & x){ out<<x.str(); return out;}map<char, int> mp;string input;int main(){ bool flag = false; int k = 0, len, begin; bign num, sum, mod; //freopen("input.txt", "r", stdin); while(true){ flag = false; while(getline(cin, input)){ if(input.size() == 0 && flag) break; else if(input.size() == 0 && !flag) continue; else { while(input[0] == ' ') input.erase(input.begin()); while(input[input.size() - 1] == ' ') input.erase(input.size() - 1, 1); if(!flag){ if(k) cout<<endl; mp.clear(); k = 1; flag = true; len = input.size(); for(int i = 0; i < len; i++) mp[input[i]] = i; }else { begin = 2; for(int i = 0; i < input.size(); i++) if(mp.count(input[i]) && begin < mp[input[i]] + 1) begin = mp[input[i]] + 1; sum = 0; for(; begin <= len; begin++){ mod = 1; num = 0; for(int j = input.size() - 1; j >= 0; j--){ if(mp.count(input[j])){ num = num + mod * mp[input[j]]; mod = mod * begin; } } sum = sum + num; } cout << sum << endl; } } } if(!flag) break; } return 0;}