直接贴代码吧
不能暴力枚举会超时,需要用二分查找优化
数可能很大 longlong用起来 不用会变得不幸
#include<iostream>
using namespace std;
int get(char c)
{
if(c-'0'<=9) return c-'0';
else return c-'a'+10;
}
long long cal(string s,long long x)
{
long long res=0;
for(int i=0;i<s.length();++i)
{
if ((double)res * x + get(s[i]) > 1e16) return 1e18;//这句代码一定要写,不写就只有15分亲测,double虽然精度不够但是位数足够
res=res*x+get(s[i]);
}
return res;
}
int main()
{
string a,b;
int k,radix;
cin>>a>>b>>k>>radix;
if(k==2) swap(a,b);
long long target=cal(a,radix);
long long l=0,r=target;
for(int i=0;i<b.length();++i) if(get(b[i])>=l) l=get(b[i])+1;//这个我觉得无所谓写不写 因为遍历找到最大的也需要时间,不一定比直接二分快
while(l<r)//二分查找
{
long long mid=l+r>>1;
if(cal(b,mid)>=target) r=mid;
else l=mid+1;
}
if(cal(b,l)!=target) puts("Impossible");
else cout<<l;
return 0;
}