Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is yes
, if 6 is a decimal number and 110 is a binary number.
Now for any pair of positive integers N1 and N2, your task is to find the radix of one number while that of the other is given.
Input Specification:
Each input file contains one test case. Each case occupies a line which contains 4 positive integers:
N1 N2 tag radix
Here N1
and N2
each has no more than 10 digits. A digit is less than its radix and is chosen from the set { 0-9, a
-z
} where 0-9 represent the decimal numbers 0-9, and a
-z
represent the decimal numbers 10-35. The last number radix
is the radix of N1
if tag
is 1, or of N2
if tag
is 2.
Output Specification:
For each test case, print in one line the radix of the other number so that the equation N1
= N2
is true. If the equation is impossible, print Impossible
. If the solution is not unique, output the smallest possible radix.
Sample Input 1:
6 110 1 10
Sample Output 1:
2
Sample Input 2:
1 ab 1 2
Sample Output 2:
Impossible
题目大意:输入两个数a,b,指定其中某个数是几进制数,若要使a=b,那么另一个数应该是几进制数,若有多个答案,输出最小的,若没有,输出Improssible
解题思路:首先将已知进制的数转换为十进制数,然后二分查找另一个数可能的进制数,注意进制可能大于36,数据范围可能超ll
AC代码:
#include <iostream>
#include <map>
using namespace std;
typedef long long ll;
string a,b;
map <char,ll> m;
int judge(ll w,ll val)
{
ll sum=0;
for(int i=0;i<b.size();i++){
sum=sum*w+m[b[i]];
if(sum>val||sum<0) return 1;//若数据范围超ll,则sum为负值
}
if(sum==val) return 0;
else return -1;
}
int main()
{
string s,t;
int flag,radix;
ll cnt=0;
for(char i='0';i<='9';i++,cnt++) m[i]=cnt;
for(char i='a';i<='z';i++,cnt++) m[i]=cnt;
cin>>s>>t>>flag>>radix;
if(flag==1) { a=s;b=t; }
else { a=t;b=s; }
ll num=0;
for(int i=0;i<a.size();i++){
num=num*radix+m[a[i]];
}
ll maxx=0;
for(int i=0;i<b.size();i++){
maxx=max(maxx,m[b[i]]);
}
ll l=maxx+1,r=num+1;
ll ans=0;
while(l<=r){
ll mid=(l+r)>>1;
int f=judge(mid,num);
if(f==0) {
ans=mid;
break;
}
else if(f==1) r=mid-1;
else l=mid+1;
}
if(ans){
if(b.size()==1) ans=maxx+1;
cout<<ans<<endl;
}
else cout<<"Impossible"<<endl;
return 0;
}