1.需要注意的是进制可能很大 要用long long
2.顺序查找会超时 用二分
3.最小进制 因为单个数的时候 进制大于该数都对
4.代码来自网络 代码中两处去掉个别样例不过 奇怪
5.没有认真写这题
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int chartrans(char x)
{
int i;
if(x>='0'&&x<='9')
i=x-'0';
else
i=x-'a'+10;
return i;
}
long long stringtrans(char* x,long long radix)
{
int i,l;
long long ans=0;
l=strlen(x);
for(i=0;i<l;i++)
{
ans*=radix;
ans+=chartrans(x[i]);
if(ans<0)//去掉不对
return -1;//去掉不对
}
return ans;
}
int main()
{
char as[15],bs[15],temp[15];
long long tag,radix,aimNum,lenA,lenB;
scanf("%s%s%lld%lld",as,bs,&tag,&radix);
if(tag==1)
{
strcpy(temp,as);
strcpy(as,bs);
strcpy(bs,temp);
tag=2;
}
lenA=strlen(as);
lenB=strlen(bs);
aimNum=stringtrans(bs,radix);
long long low=2;//进制下限
for(int i=0,j;i<lenA;++i)//去掉不对
{//去掉不对
j=chartrans(as[i]);//去掉不对
if(j>=low)//去掉不对
low=j+1;//去掉不对
}//去掉不对
long long high=aimNum+1;//进制上限
long long aimRadix;
long long tempAns;
bool flag=false;
for(;low<=high;)//二分搜索
{
aimRadix=(high+low)/2;
tempAns=stringtrans(as,aimRadix);
if(tempAns==-1||tempAns>aimNum)
high=aimRadix-1;
else if(tempAns<aimNum)
low=aimRadix+1;
else
{
flag=true;
break;
}
}
if(flag)
printf("%lld\n",aimRadix);
else
printf("Impossible\n");
return 0;
}