#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int binlowfind(long long arr[], int left, int right, int x)
{
while (left < right)
{
int mid = left + (right - left) / 2;
if (x <= arr[mid])
{
right = mid;
}
else {
left = mid + 1;
}
}
return left;
}
long long trans_10(int num[], int radix, int N)
{
long long ans = 0;
for (int i = 0; i < N; i++)
{
ans *= radix;
ans += num[i];
}
return ans;
}
int* tonums(string str)
{
int ans[10];
for (int i = 0; i < str.size(); i++)
{
int t;
if (str[i] >= 'a'&&str[i] <= 'z')
{
t = str[i] - 'a' + 10;
}
else {
t = str[i] - '0';
}
ans[i] = t;
}
return ans;
}
int main()
{
string N1, N2;
int tag, radixgive;
cin >> N1;
cin >> N2;
scanf("%d %d", &tag, &radixgive);
string havnum_weizhi;
string neednum_weizhi;
if (tag == 1)
{
havnum_weizhi = N1;
neednum_weizhi = N2;
}
else {
havnum_weizhi = N2;
neednum_weizhi = N1;
}
int neednums[10];
int havenums[10];
int lenneed = neednum_weizhi.size();
int lenhave = havnum_weizhi.size();
for (int i = 0; i < havnum_weizhi.size(); i++)
{
int t;
if (havnum_weizhi[i] >= 'a'&&havnum_weizhi[i] <= 'z')
{
t = havnum_weizhi[i] - 'a' + 10;
}
else {
t = havnum_weizhi[i] - '0';
}
havenums[i] = t;
}
long long needfindx = trans_10(havenums, radixgive, lenhave);
int maxx = -1;
for (int i = 0; i < neednum_weizhi.size(); i++)
{
int t;
if (neednum_weizhi[i] >= 'a'&&neednum_weizhi[i] <= 'z')
{
t = neednum_weizhi[i] - 'a' + 10;
}
else {
t = neednum_weizhi[i] - '0';
}
neednums[i] = t;
maxx = max(maxx, t);
}
int left = maxx + 1;
int right = 20000;
long long numsinradixs[20000];
bool find=false;
int ans;
for(int i=maxx+1;i<111;i++)
{
long long t=trans_10(neednums, i, lenneed);
if(t==needfindx)
{
ans=i;
find=true;
break;
}
}
if (find)
{
cout << ans;
}
else {
cout << "Impossible";
}
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<bits/stdc++.h>
long long inf = (1LL << 63) - 1;
using namespace std;
int binlowfind(long long arr[], int left, int right, int x)
{
while (left < right)
{
int mid = left + (right - left) / 2;
if (x <= arr[mid])
{
right = mid;
}
else {
left = mid + 1;
}
}
return left;
}
long long trans_10(int num[], int radix, int N)
{
long long ans = 0;
for (int i = 0; i < N; i++)
{
ans *= radix;
ans += num[i];
if (ans<0 || ans>inf)
{
return -1;
}
}
return ans;
}
int* tonums(string str)
{
int ans[10];
for (int i = 0; i < str.size(); i++)
{
int t;
if (str[i] >= 'a'&&str[i] <= 'z')
{
t = str[i] - 'a' + 10;
}
else {
t = str[i] - '0';
}
ans[i] = t;
}
return ans;
}
int main()
{
string N1, N2;
int tag, radixgive;
cin >> N1;
cin >> N2;
scanf("%d %d", &tag, &radixgive);
string havnum_weizhi;
string neednum_weizhi;
if (tag == 1)
{
havnum_weizhi = N1;
neednum_weizhi = N2;
}
else {
havnum_weizhi = N2;
neednum_weizhi = N1;
}
int neednums[10];
int havenums[10];
int lenneed = neednum_weizhi.size();
int lenhave = havnum_weizhi.size();
for (int i = 0; i < havnum_weizhi.size(); i++)
{
int t;
if (havnum_weizhi[i] >= 'a'&&havnum_weizhi[i] <= 'z')
{
t = havnum_weizhi[i] - 'a' + 10;
}
else {
t = havnum_weizhi[i] - '0';
}
havenums[i] = t;
}
long long needfindx = trans_10(havenums, radixgive, lenhave);
int maxx = -1;
for (int i = 0; i < neednum_weizhi.size(); i++)
{
int t;
if (neednum_weizhi[i] >= 'a'&&neednum_weizhi[i] <= 'z')
{
t = neednum_weizhi[i] - 'a' + 10;
}
else {
t = neednum_weizhi[i] - '0';
}
neednums[i] = t;
maxx = max(maxx, t);
}
int left = maxx + 1;
int right = 36;
long long numsinradixs[37];
for (int i = left; i <= right; i++)
{
numsinradixs[i] = trans_10(neednums, i, lenneed);
}
int index = binlowfind(numsinradixs, left, right, needfindx);
if (numsinradixs[index] == needfindx)
{
cout << index;
}
else {
cout << "Impossible";
}
return 0;
}