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的暴力枚举,但是在最终会有一个测试点没法通过,一个测试点运行超时,于是就按照网上大多数的方法采用二分查找,但是还是有一个测试点无法通过,我已经考虑到了数值溢出的情况了啊

posted on 2020-01-15 08:46  妄想症T  阅读(197)  评论(0编辑  收藏  举报

导航