题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805507225665536

    难点:

    1. 取出当前位
    2. 确定二分的上下界限
    3. t<0怎么来的?

    2.25update: t<0的时候表示溢出

    1. #include<algorithm>
    2. #include<string>
    3. #include<iostream>
    4. #include<cstdio>
    5. #include<cctype>
    6. #include<cmath>
    7. using namespace std;
    8. long long convert(string n1, long long radix){
    9. //cout<<"radix = "<<radix<<endl;
    10. long long ans = 0, temp = 0;
    11. int index = 0;
    12. for(auto it = n1.begin();it!=n1.end();it++){
    13. temp = isdigit(*it) ? *it - '0': *it - 'a' + 10;//取出当前位
    14. //cout<<"ans = "<<ans<<"radix = "<<radix<<"temp = "<<temp<<endl;
    15. ans = ans * radix + temp;
    16. }
    17. return ans;
    18. }
    19. long long find_radix(string n, long long num) {
    20. char it = *max_element(n.begin(), n.end());//n中最大的元素
    21. long long low = (isdigit(it) ? it - '0': it - 'a' + 10) + 1;//进制至少是这么多
    22. long long high = max(num, low);//最大是num这么多和low的界限
    23. while (low <= high) {
    24. long long mid = (low + high) / 2;
    25. long long t = convert(n, mid);
    26. if (t < 0 || t > num) high = mid - 1;//小于0是怎么来的?
    27. else if (t == num) return mid;
    28. else low = mid + 1;
    29. }
    30. return -1;
    31. }
    32. int main(){
    33. string n1, n2;
    34. long long tag, radix;
    35. cin>>n1>>n2;
    36. scanf("%lld%lld", &tag, &radix);
    37. //先转化
    38. if(tag == 2) swap(n1, n2);
    39. long long t = convert(n1,radix);
    40. long long result = find_radix(n2, t);
    41. if (result != -1) {
    42. printf("%lld", result);
    43. } else {
    44. printf("Impossible");
    45. }
    46. return 0;
    47. }