#include<iostream>
#include<string>
#include<cmath>
#include <cctype>
#include<algorithm>
using namespace std;
bool flag=false;
long long ctoi(char c){
if(c<='9')
return (long long)c-'0';
else
return (long long)c-'a'+10;
}
long long convert(string s,long long radix){
char c=s[0];
long long ans=ctoi(c);
for(int i=1;i<s.size();i++){
ans*=radix;
int a=ctoi((char)s[i]);
ans+=a;
}
return ans;
}
int main(){
long long n1,n2,radix;int tag,another;
string s[3];
cin>>s[1]>>s[2]>>tag>>radix;
another=3-tag;
n1 = convert(s[tag],radix);
char c=*max_element(s[another].begin(), s[another].end());
long long left=ctoi(c)+1,right=max(ctoi(c)+1,n1);
// cout<<left<<" "<<right;
for(radix=(left+right)/2;left<=right;radix=(left+right)/2){
n2=convert(s[another],radix);
if(n2==n1){
cout<<radix;
return 0;
}
if(n2>n1||n2<0){
right=radix-1;
}else{
left=radix+1;
}
}
cout<<"Impossible";
return 0;
}
注意点分析:
1、二分的端点设置,即考虑输出进制的最大最小值。left=n1数值位的最大值+1,right=max(left和n1)
If the solution is not unique, output the smallest possible radix.
input:
6 6 1 10
output:
7
radix>36举例
input:
66 10 1 10
output:
66
2、若基数太大,转化出十进制的n2范围会超过long long变为负数,此时应判为太大 n2>n1
3、测试点7、8、10 radix答案为大整数。请注意二分端点,转化十进制结果等都要使用long long。或者说除了访问string的计数器之外,都尽量用 long long。
4、关于left<=right,而非<为循环条件。
首先left>right时必然退出。
其次让 left=right 时 ,再运行一次,是为了让mid=left=right。