题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805507225665536
二分查找时,left = 2, right = max(36,N).
转进制时,防止溢出。
#include <cstdio>
#include <cstring>
typedef long long LL;
const LL inf = (1LL << 63) - 1;
int change(char a){
if (a >= '0' && a <= '9')
return a - '0';
else if(a >= 'a' && a <= 'z')
return a - 'a' + 10;
}
LL todecimal(char a[], int len, LL radix){
int num;
LL result = 0;
for(int i = 0; i < len; i++){
num = change(a[i]);
if(num >= radix)
return -1;
result = result * radix + num;
if(result < 0)
return inf;
}
return result;
}
LL max(LL a, LL b){
if(a > b)
return a;
else
return b;
}
LL binarySearch(LL x, char a[], int len){
LL y, left = 2, right, mid;
right = max(36, x);
while(left < right){
mid = (left + right) / 2;
y = todecimal(a, len, mid);
if(y >= x)
right = mid;
else
left = mid + 1;
}
y = todecimal(a, len, left);
if(y == x)
return left;
else
return 0;
}
int main(){
char a[2][15];
int tag;
LL radix, N;
scanf("%s %s %d %lld", a[0], a[1], &tag, &radix);
int len = strlen(a[--tag]);
N = todecimal(a[tag], len, radix);
len = strlen(a[!tag]);
LL other_radix = binarySearch(N, a[!tag], len);
if(other_radix){
printf("%lld\n", other_radix);
}
else
printf("Impossible\n");
return 0;
}