版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w419387229/article/details/81385897
本来以为是个水题,又涉及进制转换,所以想偷懒用java搞,结果GG了。 想了半天觉得进制限制应该不是36,才开始改。
思路就是找到查找目标的进制上下界,下界是这个字符串中最大的字符+1,上界有两种情况:一种是如果已经确定的那一房,十进制大于下界,那么上界就是那个十进制数+1;否则就是下界到36。
还有个坑就是可能存在不止一个答案,二分查找最小的答案。
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
public class Main{
static Scanner sc = new Scanner(System.in);
static int tag, rad;
static String s1, s2;
static long findX(String s) {
char maxc = '0';
for(int i = 0; i < s.length(); i++) {
if(s.charAt(i) > maxc)
maxc = s.charAt(i);
}
if(maxc == '0') return 2;
if(maxc >= '1' && maxc <= '9') return maxc - 47;
else return maxc - 86;
}
static long exchange(String s, long rad) {
int len = s.length();
long sum = 0;
for(int i = 0; i < len; i++) {
if(s.charAt(i) <= '9')
sum = sum * rad +(s.charAt(i) - '0');
else
sum = sum * rad +(s.charAt(i) - 'a' + 10);
}
return sum;
}
static void solve(String s, long left, long right, long res) {
long mid = (right + left) / 2;
long ans = 0;
while(left <= right) {
long tmp = exchange(s, mid);
if(tmp > res || tmp < 0) {
right = mid - 1;
}
else if(tmp < res) {
left = mid + 1;
}
else {
ans = mid;
right = mid - 1;
}
mid = (left + right) / 2;
}
if(ans == 0)
System.out.println("Impossible");
else
System.out.println(ans);
}
public static void main(String[] args) {
s1 = sc.next(); s2 = sc.next(); tag = sc.nextInt(); rad = sc.nextInt();
long res, left;
String s;
if(tag == 1) {
res = exchange(s1, rad);
left = findX(s2);
s = s2;
}
else {
res = exchange(s2, rad);
left = findX(s1);
s = s1;
}
if(left >= res)
solve(s,left,36,res);
else
solve(s,left,res+1,res);
}
}