进制转换+二分
#include<iostream>
#include<string>
using namespace std;
long long getNum(string s,long long radix){
long long sum=0;
long long t=1;
for(int i=s.size()-1;i>=0;i--){
int p;
if(s[i]<='9'&&s[i]>='0') p=s[i]-'0';
else p=s[i]-'a'+10;
sum+=p*t;
t=t*radix;
}
return sum;
}
int main(){
string N1 ,N2 ;
int tag ,radix;
cin>>N1>>N2>>tag>>radix;
if(tag==2){
//交换
string s=N1;
N1=N2;
N2=s;
}
//判断
long long left=2,right=922337203685477580;//
// cout<<right<<endl;
long long num1=getNum(N1,radix);
for(int i=0;i<N2.size();i++){
long long p;
if(N2[i]<='9'&&N2[i]>='0') p=N2[i]-'0';
else p=N2[i]-'a'+10;
left=max(left,p+1);
}
// cout<<N1<<" "<<N2<<" "<<num1<<endl;
// cout<<getNum(N2,2147483647)<<endl;
while(left<right){
long long mid=(right+left)/2;
long long num2=getNum(N2,mid);
// cout<<"Num2:"<<num2<<endl;
if(num2<0) {//超出long long 范围了
right=mid-1;
continue;
}
// printf("test:%d mid:%d\n",num2,mid);
if(num2<num1){
left=mid+1;
}
else right=mid;
}
long long num2=getNum(N2,left);
if(num2==num1) cout<<left;
else cout<<"Impossible";
return 0;
}