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
andN2
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, anda
-z
represent the decimal numbers 10-35. The last numberradix
is the radix ofN1
iftag
is 1, or ofN2
iftag
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, printImpossible
. 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
题意: 给出N1和N2,给定其中一个数的基数,然后求另一个数的基数,使得两个数相等。 (这道题很多信息没有交代清楚)
注意:N1和N2最长为十位,取值从’0-9’和’a-z’选,表示十进制的0~35数,但基数理论上是2到无穷大都可以。那么就产生两个问题:上溢和遍历超时。故全程使用string,取值为负即超时+二分法缩小查找时间
附:整型有符号数上溢之后会有一个循环现象,如:int a = pow(2,31); 刚好比int所能存储的最大正值2^31 - 1 = 2147483647 大1,显示的结果刚好是int所能存储的最小负值-2^31 = -2147483648 ,也就是说,给出的已知数据是不会溢出的,那么只要是取值为负的,全部是上溢,基数取得过大了。
#include<bits/stdc++.h>
using namespace std;
long long convert(string a,long long radix) {
long long sum=0;
int tmp,step=0;
for(int i=a.size()-1;i>=0;i--) {
tmp=isdigit(a[i])?a[i]-'0':a[i]-'a'+10;
sum+=tmp*pow(radix,step++);
}
return sum;
}
long long find_radix(string a,long long num) {
long long low,mid,high,res,tmp;
char it=*max_element(a.begin(),a.end());
low=(isdigit(it)?it-'0':it-'a'+10)+1;
high=max(num,low);
while(low<=high) {
mid=(low+high)/2;
long long tmp=convert(a,mid);
if(tmp<0||tmp>num) high=mid-1;
else if(tmp==num) return mid;
else low=mid+1;
}
return -1;
}
int main() {
string n1,n2;
long long radix;
int tag;
cin>>n1>>n2>>tag>>radix;
long long res=(tag==1?find_radix(n2,convert(n1,radix)):find_radix(n1,convert(n2,radix)));
if(res==-1) cout<<"Impossible\n";
else cout<<res<<endl;
return 0;
}