题目链接:传送门
这道题有点坑
本来是老老实实的进制转化
活脱脱被搞成了二分,我怎么写怎么不得行,最后选择了看博客。
以下是博客链接:我在这里呀!
个人觉得坑点是以下两点
①虽然数字是0-35,但是radix可能非常大,所以要用到二分,而不是答案局限在2-36里面顺序搜索。
②由于radix可能非常大,所以算出来的数可能也非常大,要防止溢出,对溢出要有相应的判断。
我真是万万没想到这是道二分题!
我今天算了下,甲级题库155道题,每天十道半个月左右可以刷完。加油吧!
tips:
①代码里要常用到的功能写成函数调用会很方便!
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<string>
#include<algorithm>
#include<iostream>
#include<map>
#include<set>
#include<queue>
#include<stack>
#define inf 4000000000000000000
using namespace std;
typedef long long ll;
const ll maxn=1e6+50;
const ll mod=1e9+7;
const double eps=1e-9;
string a,b;
ll tonum(char x)
{
if(x>='0'&&x<='9')
{
return x-'0';
}
else return x-'a'+10;
}
ll tod(string a,ll radix)
{
ll shu=0;
for(ll i=0;i<a.size();i++)
{
shu=shu*radix+tonum(a[i]);
}
if(shu<0)return -1;
else return shu;
}
int main()
{
ll tag,radix;
cin>>a>>b>>tag>>radix;
if(tag==2)swap(a,b);
ll shu1=tod(a,radix);
//scanf("%lld",&tag);
ll l=2,r=shu1;
for(ll i=0;i<b.size();i++)
{
l=max(l,tonum(b[i])+1);
}
while(l<=r)
{
ll mid=(l+r)/2;
ll num=tod(b,mid);
if(num>=shu1||num==-1)r=mid-1;
else l=mid+1;
}
if(tod(b,l)==shu1)printf("%lld\n",l);
else printf("Impossible\n");
//scanf("%lld",&tag);
return 0;
}