思路:
这题有坑啊
(1)z表示36并不意味着只到36进制,最小2进制,最大进制=另一个数的值
(2)可能会超时,用二分
(3)用long long!在二分过程中会溢出,所以要特判,当溢出时说明书过大,right=mid-1
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<cmath>
#include<set>
#define ll long long
using namespace std;
const int N=1005;
ll to_num(char c){
if(c>='0'&&c<='9')return c-'0';
else return c-'a'+10;
}
ll tra(string s,ll r){//把r进制的x转成10进制
int len=s.length();
ll res=0,tmp=1;
for(int i=len-1;i>=0;i--){
res+=tmp*to_num(s[i]);
if(res<0||tmp<0)return -1;
tmp=tmp*r;
}
return res;
}
int main(){
int tag,r;
string a,b;
ios::sync_with_stdio(false);
cin>>a>>b>>tag>>r;
if(tag==2)swap(a,b);
ll numa=tra(a,r);//把r进制的a转换成10进制
ll left=2,right=numa+1;
for(int i=0;i<b.length();i++){
left=max(left,to_num(b[i])+1);
}
while(right>=left){
ll mid=(left+right)>>1;
ll t=tra(b,mid);
if(t==-1||t>=numa)right=mid-1;
else left=mid+1;
}
if(tra(b,left)==numa)printf("%lld\n",left);
else printf("Impossible\n");
}