/*首先是radix的范围问题 最小应该是字母最大值+1, 最大在num和字母最大值+1选最大值
二分法 主要左边界和右边界的更新,不然会陷入死循环...
还有变量名不要冲突 不然一直找不到错在哪.............
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
string n1, n2;
int tag, r;
ll maxa=0, maxb=0;
cin >> n1 >> n2 >> tag >> r;
if(n1 == n2) {
cout << r << endl;
return 0;
}
int l1 = n1.length(), l2 = n2.length();
ll a[l1+5], b[l2+5];
for(int i=0; i<l1; i++) {
if(n1[i] <= '9' && n1[i] >= '0') {
a[i] = n1[i]-'0';
} else a[i] = (n1[i]-'a'+10);
maxa = max(maxa, a[i]);
}
for(int i=0; i<l2; i++) {
if(n2[i] <= '9' && n2[i] >= '0') {
b[i] = n2[i]-'0';
} else b[i] = (n2[i]-'a'+10);
maxb = max(maxb, b[i]);
}
ll num = 0;
if(tag == 1) {
for(int i=0; i<l1; i++) {
num *= r;
num += a[i];
}
ll l = maxb+1, rt = max(num, maxb+1);
for(ll i=(l+rt)/2; l<=rt; ) {
ll tmp = 0;
for(int j=0; j<l2; j++) {
tmp *= i;
tmp += b[j];
}
if(tmp == num) {
cout << i << endl;
return 0;
} else if(tmp > num || tmp < 0) {//溢出
rt = i-1;
i = (l+rt)/2;
} else {
l = i+1;
i = (l+rt)/2;
}
}
cout << "Impossible" << endl;
} else {
for(int i=0; i<l2; i++) {
num *= r;
num += b[i];
}
ll l = maxa+1, rt = max(maxa+1, num);
for(ll i=(l+rt)/2; l<=rt; ) {
ll tmp = 0;
for(int j=0; j<l1; j++) {
tmp *= i;
tmp += a[j];
}
if(tmp == num) {
cout << i << endl;
return 0;
} else if(tmp > num || tmp< 0) {
rt = i-1;
i = (l+rt)/2;
} else {
l = i+1;
i = (l+rt)/2;
}
}
cout << "Impossible" << endl;
}
return 0;
}
//24分 运行超时
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
string n1, n2;
int tag, r;
ll maxa=0, maxb=0;
cin >> n1 >> n2 >> tag >> r;
if(n1 == n2) {
cout << r << endl;
return 0;
}
int l1 = n1.length(), l2 = n2.length();
ll a[l1], b[l2];
for(int i=0; i<l1; i++) {
if(n1[i] <= '9' && n1[i] >= '0') {
a[i] = n1[i]-'0';
} else a[i] = (n1[i]-'a'+10);
maxa = max(maxa, a[i]);
}
for(int i=0; i<l2; i++) {
if(n2[i] <= '9' && n2[i] >= '0') {
b[i] = n2[i]-'0';
} else b[i] = (n2[i]-'a'+10);
maxb = max(maxb, b[i]);
}
ll num = 0;
if(tag == 1) {
for(int i=0; i<l1; i++) {
num *= r;
num += a[i];
}
if(num == 0 && n2=="0") {
cout<<"2";
return 0;
}
int lb = max(num, maxb+1);
for(int i=maxb+1; i<=lb; i++) {
ll tmp = 0;
for(int j=0; j<l2; j++) {
tmp *= i;
tmp += b[j];
}
// cout << num << ":" << tmp << endl;
if(tmp == num) {
cout << i << endl;
return 0;
} else if(tmp > num) break;
}
cout << "Impossible" << endl;
} else {
for(int i=0; i<l2; i++) {
num *= r;
num += b[i];
}
if(num == 0 && n1=="0") {
cout<<"2";
return 0;
}
int lb = max(num, maxa+1);
for(int i=maxa+1; i<=lb; i++) {
ll tmp = 0;
for(int j=0; j<l1; j++) {
tmp *= i;
tmp += a[j];
}
if(tmp == num) {
cout << i << endl;
return 0;
} else if(tmp > num) break;
}
cout << "Impossible" << endl;
}
return 0;
}