题目描述

分析:
给出两个数,一个数的进制已知,寻找和这个数相等的另一个数的k进制,若是有多个k输出最小的一个。
把两个数都转换成十进制进行比较,寻找进制的时候采用二分查找的方法,二分查找的下限是已知进制数的最大的位数加1,上限是已知进制数的十进制数。
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;
map<char,int> mp;
typedef long long ll;
ll change(char* s,ll radix){
ll ans=0;
for(int i=0;s[i]!='\0';i++){
ans=ans*radix+mp[s[i]];
}
return ans;
}
ll findRadix(char* n1,char* n2,ll radix){
ll left=-1,right=change(n1,radix);
ll mid,k;
ll num=right;
for(int i=0;n2[i]!='\0';i++){
left=max(left,(ll)mp[n2[i]]+1);
}
while(left<right){
mid=left+(right-left)/2;
k=change(n2,mid);
if(k<0||k>=num){
right=mid;
}else if(k<num){
left=mid+1;
}
}
if(change(n2,left)!=num)
{
return -1;
}
else{
return left;
}
}
int main(){
for(int i=0;i<36;i++){
if(i<10){
mp.insert(make_pair(i+'0',i));
}
else{
mp.insert(make_pair(i-10+'a',i));
}
}
char n1[15];
char n2[15];
ll tag,radix;
scanf("%s %s %lld %lld",&n1,&n2,&tag,&radix);
if(tag==1){
radix=findRadix(n1,n2,radix);
}
else{
radix=findRadix(n2,n1,radix);
}
if(radix==-1){
printf("Impossible\n");
}
else{
printf("%lld",radix);
}
return 0;
}