#include <stdio.h>
#include <vector>
#include<string>
#include <math.h>
#include <unordered_map>
//最大涉及36进制的转换!
using namespace std;
int main() {
unordered_map<char, int> MapIn = { //便于处理输入数据
{'A', 10}, {'B', 11}, {'C', 12},
{'D', 13}, {'E', 14}, {'F', 15},
{'G', 16}, {'H', 17}, {'I', 18},
{'J', 19}, {'K', 20}, {'L', 21},
{'M', 22}, {'N', 23}, {'O', 24},
{'P', 25}, {'Q', 26}, {'R', 27},
{'S', 28}, {'T', 29}, {'U', 30},
{'V', 31}, {'W', 32}, {'X', 33},
{'Y', 34}, {'Z', 35}
};
unordered_map<int, char> MapPut = { //便于处理输出数据
{10, 'a'}, {11, 'b'}, {12, 'c'},
{13, 'd'}, {14, 'e'}, {15, 'f'},
{16, 'g'}, {17, 'h'}, {18, 'i'},
{19, 'j'}, {20, 'k'}, {21, 'l'},
{22, 'm'}, {23, 'n'}, {24, '0'},
{25, 'p'}, {26, 'q'}, {27, 'r'},
{28, 's'}, {29, 't'}, {30, 'u'},
{31, 'v'}, {32, 'w'}, {33, 'x'},
{34, 'y'}, {35, 'z'}
};
int m, n;
scanf("%d%d", &m, &n);
char x[30];
scanf("%s", x);
unsigned long long res = 0;
string s = x;
//注意将输入的字母进行处理成数(一边遍历一边处理无需存储对应的数)
for (int i = 0 ; i < s.size() ;
i++) { //将m进制的数x统一先转为十进制数
if (s[s.size() - 1 - i] >= '0' && s[s.size() - 1 - i] <= '9') {
res += (s[s.size() - 1 - i] - '0') * pow(m, i);//字符转为int类型
} else { //注意:字符串中的字符作为下标(键)
res += (MapIn[s[s.size() - 1 - i]]) * pow(m, i);
}
}
vector<int> goal; //存储n进制的每一位数
//再将十进制数res转为n进制
if ( n == 10 ) { //如果最终要转换的进制数为10进制直接进行输出
printf("%lld", res);
} else {
while ( res != 0) { //求解 n进制的每一数从低到高存入目标数组
goal.push_back(res % n);
res = res / n;
}
for (int i = goal.size() - 1; i >= 0 ; i--) { //反向输出
if ( goal[i] >= 10 && goal[i] <= 35) { //10-35输出字母
printf("%c", MapPut[goal[i]]);
} else {
printf("%d", goal[i]); //0-9输出数字
}
}
}
printf("\n");
return 0;
}