此题算是甲级中的大坑题了。。。通过率题库中最低0.09。。。
如果全程不用long long型,倒数第7行的n1+1改为36,可得到18分; 改为70可以得到24分;
有时需要用最小的代价获取更多的分数。。。
//
// main.cpp
// PATA1010
//
// Created by Phoenix on 2018/1/31.
// Copyright © 2018年 Phoenix. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <cstring>
long long n1, n2;
long long inf = ((long long) 1 << 63) - 1;
//将数组a的index进制转化为十进制
long long dicimal(char a[], long long index) {
long long ans = 0;
int len = strlen(a);
int k;
for(int i = 0; i < len; i++) {
if(a[i] >= '0' && a[i] <= '9'){
k = a[i] - '0';
}
if(a[i] >= 'a' && a[i] <= 'z'){
k = a[i] - 'a' + 10;
}
ans = ans * index + k;
if(ans < 0) return -1; //ans溢出返回-1
}
return ans;
}
int cmp(char a[], long long index, long long t) {
int len = strlen(a);
long long num = dicimal(a, index);
if(num < 0) return 1; //num溢出则num > t;
if(t > num) return -1;
else if(t == num) return 0;
else return 1;
}
//二分查找是否存在某一进制数flag,使得a,b所表示的十进制数n1,n2相等,存在返回该进制数,否则返回-1;
long long find(char a[], long long low, long long high) {
long long mid;
while(low <= high) {
mid = (low + high) / 2;
int flag = cmp(a, mid, n1);
if(flag == 0) {
return mid;
} else if(flag == -1) {
low = mid + 1;
} else{
high = mid - 1;
}
}
return -1;
}
int main(int argc, const char * argv[]) {
char a[15], b[15],temp[15];
int tag;
long long radix;
scanf("%s %s %d %lld", a, b, &tag, &radix);
if(tag == 2) { //将a数组设置为已知数组
strcpy(temp, a);
strcpy(a, b);
strcpy(b, temp);
}
int m = 0;
for(int i = 0; i < strlen(b); i++){ //求出b数组可表示的最小进制
if(b[i] >= '0' && b[i] <='9') {
int k = b[i] - '0';
if(k > m) {
m = k;
}
}
if(b[i] >= 'a' && b[i] <= 'z') {
int k = b[i] - 'a' + 10;
if(k > m) {
m = k;
}
}
}
m++; //最小进制为可表示的最大数+1,例如789的最小进制为10
n1 = dicimal(a, radix); //a所对应的十进制数
long long flag = find(b, m, n1 + 1); //由n2的最小进制数与n1所对应的十进制数中寻找
if(flag == -1) printf("Impossible\n");
else{
printf("%lld\n", flag);
}
return 0;
}