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
柳神强!,这道题逻辑真的要清晰,每一步都得知道要干什么,首先得转换为10进制,再要找到另一个进制,另一个进制怎么着呢,首先它必然大于它所对的数的,某个位上的最大值,比如198,那么这个进制必然大于9,所以用二分法,low就确定了,那么high自然就是另一个数了,如果在另一个数的范围内还找不到,显然就是不存在了,如果假设100,如果我们在100进制内没有找到,那么下一个就是101,显然,就算这个数是1,十进制后也是101,显然不可能大于100,所以上限确定
关于二分运算,确实做得很少,关于左开右闭,与左闭右闭理解的不透彻,等我力扣刷完dp,就刷二分吧
#include<bits/stdc++.h>
using namespace std;
long long convert(string n,long long radix)
{
long long sum=0;
int temp=0,index=0;
for(int i=n.length()-1;i>=0;i--){
temp=isdigit(n[i])?n[i]-'0':n[i]-'a'+10;
sum+=temp*pow(radix,index++);
}
return sum;
}
long long find_radix(string n,long long sum)
{
char it=*max_element(n.begin(),n.end());
long long low=isdigit(it)?it-'0':it-'a'+10;
low++;
long long high=max(low,sum);
while(low<=high)
{
long long mid=(low+high)/2;
long long t=convert(n,mid);
if(t<0||t>sum) high=mid-1;
else if(t==sum) return mid;
else
low=mid+1;
}
return -1;
}
int main()
{
string n1,n2;
long long tag,radix,result_radix;
cin>>n1>>n2>>tag>>radix;
result_radix=tag==1?find_radix(n2,convert(n1,radix)):find_radix(n1,convert(n2,radix));
if(result_radix==-1)
printf("Impossible");
else
printf("%lld",result_radix);
}