PAT甲组 1010 Radix (二分)

Posted friends-a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT甲组 1010 Radix (二分)相关的知识,希望对你有一定的参考价值。

1010 Radix (25分)

Given a pair of positive integers, for example, (6) and (110), can this equation (6 = 110) be true? The answer is yes, if 6 is a decimal number and 110 is a binary number.

Now for any pair of positive integers (N_1) and (N_2), your task is to find the radix of one number while that of the other is given.

Input Specification:

Each input file contains one test case. Each case occupies a line which contains (4) positive integers:

N1 N2 tag radix

Here N1 and N2 each has no more than (10) digits. A digit is less than its radix and is chosen from the set { (0)-(9), a-z } where (0)-(9) represent the decimal numbers (0)-(9), and a-z represent the decimal numbers (10)-(35). The last number radix is the radix of N1 if tag is (1), or of N2 if tag is (2).

Output Specification:

For each test case, print in one line the radix of the other number so that the equation N1 = N2 is true. If the equation is impossible, print Impossible. If the solution is not unique, output the smallest possible radix.

Sample

Sample Input 1:

6 110 1 10

Sample Output 1:

2

Sample Input 2:

1 ab 1 2

Sample Output 2:

Impossible

题意

给出两个正整数和其中一个数的基底,找到另一个数的基底,使两个数相等

思路

因为每个数不超过(10)位,每位最大都可能到z,所以待求的基底可能是一个很大的数,用二分法求另一个数的基底。
将一直基底的数求出来之后,二分另一个数的基底。如果当前基底下的结果小于(0)或大于已知数,那么这个基底就是偏大的,一直二分直至相等,否则返回(-1)
二分的左区间为待求基底的每位数字上最大值加一,右区间为max(左区间,已知数)

代码

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ms(a,b) memset(a,b,sizeof(a))
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=1e6+10;
const int mod=1e9+7;
const int maxm=1e3+10;
using namespace std;
ll get_num(string n,ll radix)
{
    ll ans=0;
    int l=n.length();
    for(int i=l-1;i>=0;i--)
    {
        int res;
        if(n[i]>='0'&&n[i]<='9')
            res=n[i]-'0';
        else
            res=n[i]-'a'+10;
        ans+=res*pow(radix,l-i-1LL);
    }
    return ans;
}
bool check(ll num,string n,ll radix)
{
    ll res=get_num(n,radix);
    if(num==res)
        return true;
    return false;
}
ll solve(ll num,string n)
{
    ll l,r;
    int low=0;
    for(auto i:n)
    {
        if(i>='0'&&i<='9')
            low=max(low,i-'0');
        else
            low=max(low,i-'a'+10);
    }
    l=low+1LL,r=max(1LL*l,num);
    while(l<=r)
    {
        ll mid=(l+r)/2;
        ll res=get_num(n,mid);
        if(res<0||res>num)
            r=mid-1;
        else if(res<num)
            l=mid+1;
        else if(res==num)
            return mid;
    }
    return -1;
}
int main(int argc, char const *argv[])
{
    #ifndef ONLINE_JUDGE
        freopen("in.txt", "r", stdin);
        freopen("out.txt", "w", stdout);
        srand((unsigned int)time(NULL));
    #endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    string s1,s2;
    int tag;
    ll radix;
    cin>>s1>>s2>>tag>>radix;
    ll num1,num2;
    if(tag==1)
    {
        num1=get_num(s1,radix);
        if(solve(num1,s2)==-1)
            cout<<"Impossible";
        else
            cout<<solve(num1,s2);
        cout<<endl;
    }
    else
    {
        num2=get_num(s2,radix);
        if(solve(num2,s1)==-1)
            cout<<"Impossible";
        else
            cout<<solve(num2,s1);
        cout<<endl;
    }
    #ifndef ONLINE_JUDGE
        cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s.
";
    #endif
    return 0;
}

以上是关于PAT甲组 1010 Radix (二分)的主要内容,如果未能解决你的问题,请参考以下文章

PAT 1010 Radix (25分) radix取值无限制,二分法提高效率

PAT 1010 Radix 进制转换+二分法

PAT 甲级 1010 Radix (25)(25 分)(听说要用二分,我没AC,之后再改)

PAT 甲级测试题目 -- 1010 Radix

PAT甲级1010Radix

PAT甲级1010Radix