1010 Radix (25 分)难度: 难 / 知识点: 二分查找

Posted 辉小歌

tags:

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


https://pintia.cn/problem-sets/994805342720868352/problems/994805507225665536
注意: 答案可能不是[2,36] 而是一个非常大的数
确定的数最大可能为: zzzzzzzzzz(36) 约为3610等于3,656,158,440,062,976<1e18 不会爆long long的

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long int LL;
string a,b,k;
int d;
LL get(char a) {return a<='9'?a-'0':a-'a'+10;} //获取当前位的数字
LL D(string s,LL d)//d转换成10进制 
{
    LL sum=0;
    for(int i=0;i<s.size();i++) 
    {
        if((double)sum>(1e18*1.0-get(s[i]))/d) return 1e18;//数已经超1e18了直接返回1e18即可 
        sum=sum*d+get(s[i]);
    }
    return sum;
}
bool check(string a,string b,int d)
{
    LL sum=D(a,d);
    LL l=0,r=1e12;//最坑的一个点7,答案是爆int的 
    for(LL i=0;i<b.size();i++) l=max(l,get(b[i]));
    l=l+1;
    while(l<r)
    {
        LL mid=l+r>>1;
        LL temp=D(b,mid);
        if(temp>=sum) r=mid;
        else l=mid+1;
    }
    if(D(b,l)!=sum) return false;
    cout<<l<<endl;
    return true;
}
int main(void)
{
    cin>>a>>b>>k>>d;
    if(k=="1"&&check(a,b,d)) return 0; 
    if(k=="2"&&check(b,a,d)) return 0;
    cout<<"Impossible";
    return 0;
}

以上是关于1010 Radix (25 分)难度: 难 / 知识点: 二分查找的主要内容,如果未能解决你的问题,请参考以下文章

1010 Radix (25 分) 暴力枚举

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

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

1010 Radix (25分)

A1010 Radix (25 分)

PAT 甲级1010 Radix (25分)