题目大意:给出两个数N1、N2,再给出一个tag和radix,若tag为1,表示N1为radix进制数,否则N2为radix进制数。求对于另一个数,是否存在某一进制使得两数相等。
思路:题目本身并不难,但是坑点巨多。题目所给的数中,每位上最小为0,最大为z表示35,但是进制可能会非常大,所以需要通过long long来存数,同时通过二分来判断是否有正确的答案存在。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
using namespace std;
typedef long long LL;
LL tran(string s,LL r){
reverse(s.begin(),s.end());
LL res=0,wei=1;
for(int i=0;i<(int)s.length();i++){
res+=(isdigit(s[i])? s[i]-'0':s[i]-'a'+10)*wei;
wei*=r;
}
return res;
}
int main(){
string a,b,tem;
LL tag,ra,num;
cin>>a>>b>>tag>>ra;
if(tag==1){
num=tran(a,ra);
tem=b;
}
else{
num=tran(b,ra);
tem=a;
}
int lim=0;
for(int i=0;tem[i];i++)
if(isdigit(tem[i])) lim=max(lim,tem[i]-'0');
else lim=max(lim,tem[i]-'a'+10);
LL l=lim+1,r=max(l,num);
while(l<=r){
LL mid=(l+r)/2;
LL tmp=tran(tem,mid);
if(tmp==num){
printf("%lld\n",mid);
return 0;
}
if(tmp>num||tmp<0) r=mid-1;
else l=mid+1;
}
printf("Impossible\n");
return 0;
}