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 分)难度: 难 / 知识点: 二分查找的主要内容,如果未能解决你的问题,请参考以下文章
PAT 1010 Radix (25分) radix取值无限制,二分法提高效率