题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805507225665536
注意点:数据范围大,要用LL,并且防止加减溢出。用高效的搜索方法。不注意这些只能得23分。因为有一个测试用例是LL范围的,还有一个如果从2开始递增验证,要超时。
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
typedef long long LL;
const LL INF = (1LL<<63)-1; //INF
int tonum(char a){
if(a >= '0' && a <= '9')
return a - '0';
else
return a -'a' + 10;
}
LL todecimal(string str, LL radix){
LL num = 0;
for(int i = 0; i < str.length(); i++){
int a = tonum(str[i]);
if(a >= radix)
return -1;
num = num * radix + a;
if(num < 0) //溢出
return INF;
}
return num;
}
LL binarysearch(LL l, LL x, string str){
LL r;
if(x > 36)
r = x; //最大进制为另一个数
else
r = 36;
while(l < r){
LL mid = l/2 + r/2;
LL a = todecimal(str, mid);
if(a >= x){
r = mid;
}else
l = mid + 1;
}
return l;
}
int main(){
string n1, n2;
int tag;
LL radix;
cin>>n1>>n2>>tag>>radix;
LL a;
if(tag == 1){
a = todecimal(n1, radix);
LL ans = binarysearch( 2, a, n2);
if(a == todecimal(n2, ans))
printf("%lld", ans);
else
printf("Impossible");
}else{
a = todecimal(n2, radix);
LL ans = binarysearch( 2, a, n1);
if(a == todecimal(n1, ans))
printf("%lld", ans);
else
printf("Impossible");
}
return 0;
}