Java
import java.util.Scanner;
public class Main {
    private static final long INF = (long) 1e18;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String n1 = scanner.next();
        String n2 = scanner.next();
        int tag = scanner.nextInt();
        int radix = scanner.nextInt();
        if (tag == 2) {
            String temp = n1;
            n1 = n2;
            n2 = temp;
        }
        long target = calc(n1, radix);
        long l = 0, r = Math.max(target, 36L);
        for (char c : n2.toCharArray()) {
            l = Math.max(l, get(c) + 1);
        }
        while (l < r) {
            long mid = (l + r) >> 1;
            if (calc(n2, mid) >= target) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        if (calc(n2, r) != target) {
            System.out.println("Impossible");
        } else {
            System.out.println(r);
        }
    }
    private static long get(char c) {
        if (c <= '9') {
            return c - '0';
        }
        return c - 'a' + 10;
    }
    private static long calc(String n, long r) {
        long res = 0;
        for (char c : n.toCharArray()) {
            if ((double) res * r + get(c) > 1e16) {
                return INF;
            }
            res = res * r + get(c);
        }
        return res;
    }
}
C++
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int get(char c) {
    if (c <= '9') return c - '0';
    return c - 'a' + 10;
}
LL calc(string n, LL r) {
    LL res = 0;
    for (auto c : n) {
        if ((double)res * r + get(c) > 1e16) return 1e18;
        res = res * r + get(c);
    }
    return res;
}
int main() {
    string n1, n2;
    cin >> n1 >> n2;
    int tag, radix;
    cin >> tag >> radix;
    if (tag == 2) swap(n1, n2);
    LL target = calc(n1, radix);
    LL l = 0, r = max(target, 36ll);
    for (auto c : n2) l = max(l, (LL)get(c) + 1);
    while (l < r) {
        LL mid = l + r >> 1;
        if (calc(n2, mid) >= target) r = mid;
        else l = mid + 1;
    }
    if (calc(n2, r) != target) puts("Impossible");
    else cout << r << endl;
    return 0;
}