这道题的坑主要有下面几点:
1、进制上界根据所给数的十进制大小确定,下界由最大数位决定。
2、使用二分防止超时。
3、二分时注意判断查找结果是否溢出(从某一进制转换为10进制时可能发生溢出)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string n1,n2;
int tag;
ll radix;
// 转换为10进制
ll todecimal(string num,ll tag){
ll res=0;
for(int i=0;i<num.size();i++){
if(num[i]>='0' && num[i]<='9'){
res = res*tag+num[i]-'0';
}else if(num[i]>='a' && num[i]<='z'){
res = res*tag+num[i]-'a'+10;
}
}
return res;
}
// 二分查找
ll findradix(ll low,ll high,ll res){
while(low<=high){
ll mid = (low+high)/2;
ll temp = todecimal(n2,mid);
if(temp == res) return mid;
else if(temp>res || temp<0){ //判断溢出
high = mid-1;
}else{
low = mid+1;
}
}
return 0;
}
int main(){
cin>>n1>>n2;
scanf("%d %lld",&tag,&radix);
if(tag == 2){
swap(n1,n2);
}
ll minnum=0; // 查找最小下界
for(int i=0;i<n2.size();i++){
if(n2[i]>='0' && n2[i]<='9' && n2[i]-'0'>minnum) minnum = n2[i]-'0';
else if(n2[i]>='a' && n2[i]<='z' && n2[i]-'a'+10>minnum) minnum = n2[i]-'a'+10;
}
++minnum;
ll c1 = todecimal(n1,radix);
ll resradix = findradix(minnum,c1+1,c1);
if(resradix){
printf("%lld\n",resradix);
}else{
printf("Impossible\n");
}
return 0;
}