1010 Radix (25 分)
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
- 题意:给出n1和n2,以及其中一个数的进制,问另一个数是多少进制的情况下,才会是两个数相等。不存在的话,则输出Impossible
- 思路:二分搜索进制
- 最小进制下界low当然是n2的最大数字位+1
- 最大进制上界high题目没有给出说明,但最大只可能为n1(前提n1>=low)。
- 为啥不会超过n1呢,比如
- 40 10 1 10
- 很明显10是进制表示除“个位”外最小的了,那么只有当进制为40时,它才等于n1,如果进制再大,就肯定大于n1了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string.h>
#include <cmath>
using namespace std;
typedef long long ll;
ll numsto10(string n1,int radix)
{
int len=n1.length();
ll res=0;
for(int i=0; i<len; i++)
{
if(isdigit(n1[i]))
res=res*radix+n1[i]-'0';
else if(isalpha(n1[i]))
res=res*radix+n1[i]-'a'+10;
}
return res;
}
ll findradix(string n2,ll num,ll low,ll high)
{
ll mid;
while(low<=high)
{
mid=(low+high)/2;
ll tmp=numsto10(n2,mid);
if(tmp>num||tmp<0)
{
high=mid-1;
}
else if(tmp==num)
return mid;
else low=mid+1;
}
return -1;
}
int main()
{
string n1,n2;
int tag,radix;
cin>>n1>>n2>>tag>>radix;
if(tag==2)
swap(n1,n2);
ll nums10=numsto10(n1,radix);
ll low=0;
for(int i=0; i<(int)n2.length(); i++)
{
if(isdigit(n2[i]))
{
if(n2[i]-'0'>low)
low=n2[i]-'0'+1;
}
else if(isalpha(n2[i]))
{
if(n2[i]-'a'+10>low)
low=n2[i]-'a'+10+1;
}
}
ll high=max(nums10,low);
ll result=findradix(n2,nums10,low,high);
if(result==-1)
printf("Impossible\n");
else
cout<<result<<endl;
return 0;
}