前言
正文
参考题解
#include<iostream>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<string>
using namespace std;
/* 题意: 要使得满足n1==n2,给出n1或n2的进制,要你求另一个数的进制,如果不存在 一个进制满足n1==n2,则输出Impossible,否则输出能满足条件的最小的进制数 思路:首先将已知进制的数转换为10进制数,考虑到一个数的进制越大,其表示的 10进制数也越大,即具有单调性,故可以使用二分搜索另外一个数的进制(若暴力 遍历每个进制会超时),而二分最重要的是确定二分范围的上界和下界 ,下界显然 就是待求进制的那个数中最大的元素数值+1,上界则可以使用转化为10进制的后的 数sum 注意点:注意溢出的情况 */
/*将radix进制数str转化为10进制数,之所以用long long是为了防止溢出 (a的每一位分别为0~9或者a~z,其中a~z分别表示10~35)*/
long long toDecimal(string str,int radix){
long long sum=0;
int index=0,temp=0;
for(auto it=str.rbegin();it!=str.rend();it++){
temp=isdigit(*it)?*it-'0':*it-'a'+10;
sum+=temp*pow(radix,index++);
}
return sum;
}
long long getRadix(string str,long long sum){
char ch=*max_element(str.begin(),str.end());//获取最大的字符
long long low=(isdigit(ch)?ch-'0':ch-'a'+10)+1;//二分的下界
long long high=max(low,sum);//二分的上界
/*二分查找算法,如果使用当前进制转化得到数值 比另一个大或者小于0(溢出),说明这个进制太大*/
while(low<=high){
long long mid=low+high>>1;
long long temp=toDecimal(str,mid);
if(temp<0||temp>sum)high=mid-1;
else if(temp==sum)return mid;
else low=mid+1;
}
return -1;
}
int main(){
string n1,n2;
int tag=0,radix=0,res;
cin>>n1>>n2>>tag>>radix;
res=tag==1?getRadix(n2,toDecimal(n1,radix)):getRadix(n1,toDecimal(n2,radix));
if(res!=-1)printf("%lld\n",res);
else printf("Impossible\n");
return 0;
}