enlaces a los temas : https://pintia.cn/problem-sets/994805342720868352/problems/994805507225665536
题目描述
Dado un par de números enteros positivos, por ejemplo, 6 y 110, puede esta ecuación 6 = 110 ser verdad? La respuesta es sí, si 6 es un número decimal y el 110 es un número binario.
Ahora, para cualquier par de números enteros positivos N 1 y N 2, su tarea es encontrar la raíz de un número, mientras que del otro se da.
输入
Cada archivo de entrada contiene un caso de prueba. Cada caso ocupa una línea que contiene 4 números enteros positivos:
radix día N1 N2
Aquí N1 y N2 cada uno tiene no más de 10 dígitos. Un dígito es menor que su radix y se selecciona de entre el conjunto {0-9, az} donde 0-9 representan los números decimales 0-9, y az representan los números decimales 10-35. El último número radix es la radix de N1 si la etiqueta es 1, o de N2 si la etiqueta es de 2.
输出
Para cada caso de prueba, imprimir en una línea el radix de la otra número de modo que la ecuación N1 = N2 es cierto. Si la ecuación es imposible, imposible imprimir. Si la solución no es única, salida de la raíz más pequeña posible.
entrada de la muestra
6110110
Salida de muestra
2
código
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
LL map[256];
LL inf = (1LL << 63) - 1;
void init() {
for(char c = '0'; c <= '9'; c++)
map[c] = c - '0';
for(char c = 'a'; c <= 'z'; c++)
map[c] = c - 'a' + 10;
}
LL convertNum10(char a[], LL radix, LL t) {
LL ans = 0;
int len = strlen(a);
for(int i = 0; i < len; i++) {
ans = ans * radix + map[a[i]];
if(ans < 0 || ans > t)
return -1;
}
return ans;
}
int cmp(char N2[], LL radix, LL t) {
int len = strlen(N2);
LL num = convertNum10(N2, radix, t);
if(num < 0)
return 1;
if(t > num)
return -1;
else if(t == num)
return 0;
else
return 1;
}
LL binarySearch(char N2[], LL left, LL right, LL t) {
LL mid;
while(left <= right) {
mid = (left + right) / 2;
int flag = cmp(N2, mid, t);
if(flag == 0)
return mid;
else if(flag == -1)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
int findLargestDigit(char N2[]) {
int ans = -1, len = strlen(N2);
for(int i = 0; i < len; i++) {
if(map[N2[i]] > ans)
ans = map[N2[i]];
}
return ans + 1;
}
char N1[20], N2[20], temp[20];
int tag, radix;
int main() {
init();
scanf("%s %s %d %d", N1, N2, &tag, &radix);
if(tag == 2) {
strcpy(temp, N1);
strcpy(N1, N2);
strcpy(N2, temp);
}
LL t = convertNum10(N1, radix, inf);
LL low = findLargestDigit(N2);
LL high = max(low, t) + 1;
LL ans = binarySearch(N2, low, high, t);
if(ans == -1)
printf("Impossible\n");
else
printf("%lld\n", ans);
return 0;
}