/题目看起来不难但总是AC不了,看了一些大佬的AC才明白原来是测试的n进制超过了我给的进制最大值,改了之后发现超时,
顺序查找不再满足题目要求,所以用了二分法查找,特别注意的是用了long long后n还是会越界,但是越界后数值n会小于0,
利用这一点来判断是否能找到n使两数相等/
#include<stdio.h>
#include<math.h>
#include<string.h>
#define M 1000
long long getchar(char a){
long long i;
if((a-‘0’)<10&&(a-‘0’)>=0)
i=a-‘0’;
else
i=(a-‘a’)+10;
return i;
}
long long getnum(char a[],int x){
int i,k=strlen(a);
long long m=0;
for(i=0;i<k;i++)
m+=getchar(a[i])*(long long)pow(x,k-i-1);
return m;
}
long long equal(char a[],char b[],int n){
long long r,A,B,low,high,mid;
int i,k;
A=getnum(a,n);
k=strlen(b);
low=1;
r=-1;
for(i=0;i<k;i++)
if(getchar(b[i])>=low)low=getchar(b[i])+1;
high=A>low?A:low;
while(low<=high){
mid=(low+high)/2;
B=getnum(b,mid);
if(B>A)//||B<0
high=mid-1;
else if(B<A)
low=mid+1;
else{
r=mid;
break;
}
}
return r;
}
int main(){
char a[M],b[M];
int m,n;
scanf("%s %s %d %d",a,b,&m,&n);
long long p;
if(m==1)p=equal(a,b,n);
else p=equal(b,a,n);
if(p!=-1)printf("%lld",p);
else printf(“Impossible”);
return 0;
}