思路:
用确定的进制找不确定的进制,先求出已知进制的数字n1的10进制的结果sum,用longlong表示,
接着确定n2的最小进制,遍历n2数组,找出最大的位数l。
所以n2的进制在(l+1,sum+1)范围内,这样就可以用二分法求解了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
typedef long long LL;
LL NUM(char ch)
{
return (ch>='0'&&ch<='9')?(LL)(ch-'0'):(LL)(ch-'a'+10);
}
LL change(string ss,LL radix)
{
int len=ss.length(),i,j;
LL ans=0;
for(i=0;i<len;i++){
ans=ans*radix+NUM(ss[i]);
if(ans<0) return -1;
}
return ans;
}
void SP(string &s1,string &s2)
{
string tp=s1;s1=s2;s2=tp;
}
int main(void)
{
string n1,n2;
LL radix;
int i,j,tag,len;
cin>>n1>>n2>>tag>>radix;
if(tag==2) SP(n1,n2);
LL tp,l=0,sum=change(n1,radix),r,mid;
for(i=0,len=n2.length();i<len;i++){
tp=NUM(n2[i]);
if(l<tp) l=tp+1;
}
r=sum+1;
while(l<=r){
mid=(l+r)>>1;
tp=change(n2,mid);
if(tp==-1||tp>sum) r=mid-1;
else if(tp<sum) l=mid+1;
else{
cout<<mid<<endl;
return 0;
}
}
cout<<"Impossible"<<endl;
return 0;
}