pat甲级打卡-1010 Radix
一道非常好的进制题
2个精华:x进制转10进制问题,二分问题
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL get(string s,LL b){
LL res=0;
for(auto c:s){
if(c>='a' && c-'a'+10>=b){ //检验值和进制是否合法,不能存在大于进制的字符
return -1;
}
if(c<'a'){
res=res*b+c-'0';
}else{
res=res*b+c-'a'+10;
}
}
return res;
}
//二分查找
LL bSearch(string s,LL val){
//找左右边界
char it=*max_element(s.begin(),s.end());//找最大字符值,进制数要大于它
LL l=(isdigit(it) ? it - '0' : it - 'a' +10)+1;
LL r=max(val,l);
while(l<=r){
LL mid=l+r>>1;
LL t=get(s,mid);
if(t<0 || t>val) r=mid-1;
else if(t==val) return mid;
else l=mid+1;
}
return -1;
}
int main(){
string n1,n2;
int tag,radix;
cin>>n1>>n2;
cin>>tag>>radix;
//cout<<get("bg07",32);
//cout<<get(n2,2);
if(tag==1){
LL v1=get(n1,radix);
LL b=bSearch(n2,v1);
if(b!=-1) {printf("%lld",b);return 0;}
}else{
LL v1=get(n2,radix);
LL b=bSearch(n1,v1);
if(b!=-1) {printf("%lld",b);return 0;}
}
cout<<"Impossible";
return 0;
}