题目
分数 25
作者 CHEN, Yue
单位 浙江大学
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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
解法
坑点:
- 数字不会超过long long的取值范围
- radix 不止35,应该要比35更大(可以取已知数十进制值 + 1)
- 在二分法查找过程中,long long 可能会溢出,需要判断是否大于0
#include <iostream>
#include <algorithm>
using namespace std;
// 字符转数字
long long strtoN(char c) {
if (c >= '0' && c <= '9') return c - '0';
else return c - 'a' + 10;
}
// 转十进制
long long strtoD(long long radix, string str) {
long long res = 0;
long long p = 1;
for (long long i = int(str.size()) - 1; i >= 0; i--) {
res += (strtoN(str[i])) * p;
p = p * radix;
}
return res;
}
int main() {
string str1, str2, str;
long long radix, target;
long long tag;
cin >> str1 >> str2 >> tag >> radix;
if (tag == 1) {
target = strtoD(radix, str1), str = str2;
} else target = strtoD(radix, str2), str = str1;
long long l = 2;
for (long long i = 0; i < str.size(); i++) {
long long rr = strtoN(str[i]);
if (rr >= l) l = rr + 1;
}
long long r = max(l + 1, target + 1);
long long mid, temp;
do {
mid = (l + r) / 2;
temp = strtoD(mid, str);
if (temp < 0 || temp > target) r = mid - 1;
else if (temp < target) l = mid + 1;
else {
break;
}
} while (l <= r);
if (target != strtoD((l + r) / 2, str)) // 没找到
cout << "Impossible";
else cout << (l + r) / 2;
return 0;
}