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
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
int get(char a) {
if (a <= '9')
return a - '0';
else
return a + 10 - 'a';
}
LL cal(string n, LL r) {
LL sum = 0;
for (int i = 0; i < n.size(); ++i) {
if ((double) sum * r + get(n[i]) > 1e17) return 1e18;
sum = sum * r + get(n[i]);
}
return sum;
}
int main() {
int tag, radix;
string n1, n2;
cin >> n1 >> n2 >> tag >> radix;
if (tag == 2)
swap(n1, n2);
LL target = cal(n1, radix);
LL l = 0, r = target + 1;
for (int i = 0; i < n2.size(); ++i) {
l = max(l, (LL) get(n2[i]) + 1);
}
while (l < r) {
LL mid = l + r >> 1;
if (cal(n2, mid) >= target)r = mid;
else
l = mid + 1;
}
if (cal(n2, r) != target) puts("Impossible");
else cout << r << endl;
return 0;
}
该程序旨在解决将两个正整数在不同基数下转换以使等式成立的问题。输入包含两个正整数N1和N2及它们的基数,程序会尝试找到另一个数的基数,使得等式N1=N2在新基数下成立。如果无法找到解决方案或解决方案不唯一,则输出'Impossible'。示例输入输出展示了如何处理不同情况。
1089

被折叠的 条评论
为什么被折叠?



