A1010
#include<iostream>
#include<cstdio>
#include<cctype>
#include<math.h>
#include <algorithm>
using namespace std;
long long loop(string s,long long min,long long sum1){
long long max=sum1,sum2=0;
while(max>=min){
long long mid=(max+min)/2;
long long rad=1;
sum2=0;
for(int i=s.length()-1;i>=0;i--){
sum2+=(long long)((s[i]-'0'>9?s[i]-'a'+10:s[i]-'0')*rad);
rad*=mid;
}
if(sum2>sum1||sum2<0)
max=mid-1;
else if(sum2<sum1) min=mid+1;
else return mid;
}
return -1;
}
int main(){
string s1,s2;
int tag;
long long rad=1,radix;
cin>>s1>>s2>>tag>>radix;
if(tag==2) swap(s1,s2);
long long sum1=0;
for(int i=s1.length()-1;i>=0;i--){
sum1+=(long long)(s1[i]-'0'>9?s1[i]-'a'+10:s1[i]-'0')*rad;
rad*=radix;
}
char c=*max_element(s2.begin(),s2.end());
long long min=(c-'0'>9?c-'a'+10:c-'0');
if(loop(s2,min+1,sum1)==-1) cout<<"Impossible";
else cout<< loop(s2,min+1,sum1);
return 0;
}
开始使用的是for的暴力枚举,但是在最终会有一个测试点没法通过,一个测试点运行超时,于是就按照网上大多数的方法采用二分查找,但是还是有一个测试点无法通过,我已经考虑到了数值溢出的情况了啊
浙公网安备 33010602011771号