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
题意:给定两个进制的数以及其中一个的进制,求另一个 的最小的进制使二者相等,如果不存在这样的进制,则输出“Impossible",可以了解到,另一个数的最小的进制应该是其出现的最大的字符+1,最大的进制应该是max(最大的字符+1,另一个的十进制值),因为当只有一个1时,乘以最大进制就为相等的情乱,其余其他再大的情况均不可能成立
利用暴力搜索时会超时,所以采用二分法进行搜索,求出可能的最小值
满分代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<char,int>mp={{'a',10},{'b',11},{'c',12},{'d',13},{'e',14},
{'f',15},{'g',16},{'h',17},{'i',18},{'j',19},
{'k',20},{'l',21},{'m',22},{'n',23},{'o',24},
{'p',25},{'q',26},{'r',27},{'s',28},{'t',29},
{'u',30},{'v',31},{'w',32},{'x',33},{'y',34},
{'z',35}};
string a[2];
int tag,in;
ll first,last;
ll num_10(string ss,int id){//转化为10进制
int val;
ll sum=0,y=1;
for(int i=ss.size()-1;i>=0;i--){
if(ss[i]>='a'){
val=mp[ss[i]];
}else{
val=ss[i]-'0';
}
sum+=val*y;
y*=id;
}
return sum;
}
ll binary_search(string s,ll val){
ll left=first;
ll right=last+1,flag=0,min_in=last;
while(left<right){
ll mid=(left+right)/2;
ll cnt=num_10(s,mid);
if(cnt==val){
flag=1;
min_in=min(min_in,mid);
right=mid;
}else if(cnt<0||cnt>val){
right=mid;
}else{
left=mid+1;
}
}
if(flag) return min_in;
return -1;
}
int main(){
cin>>a[0]>>a[1]>>tag>>in;
ll sum=0;
int x=tag-1;
sum=num_10(a[x],in);
char c='0';
for(int i=0;i<a[1-x].size();i++){
if(a[1-x][i]>c){
c=a[1-x][i];
}
}
if(c>='a'){
first=mp[c]+1;
}else{
first=c-'0'+1;
}
last=max(sum,first);
ll res=binary_search(a[1-x],sum);
if(res==-1)
printf("Impossible\n");
else
cout<<res<<endl;
return 0;
}