【溢出值】 Radix

传送门

题意

给定一\(n_{1},n_{2},tag,radix\),分别别是两个数字,\(radix\)是一个数字表示进制,\(tag=1\)则表示\(n_{1}\)的进制,\(tag=2\)则表示\(n_{2}\)的进制,
求一个进制满足\(n_{2}\)在此进制下的数字等于\(n_{1}\),不存在输出Impossible

数据范围

每一位数字可能是0-9a-z

题解

进制不固定,最大的进制不一定是给定的z,二分法枚举最大的进制,可能会爆long long,题意肯定不会是爆的,所以爆即在二分的时候是大于的情况

Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long

ll get(char c){
	if(c >='0' && c<='9') return (ll)(c-'0');
	else return (ll)(c-'a'+10);
}
ll cal(string s,ll rad){
	ll p=1;
	ll res=0;
	for(int i=s.size()-1;i>=0;i--){
		res+=p*get(s[i]);
		p*=rad;
	}
	return res;
}
int main(){
	ll tag,rad;
	string n1,n2;
	cin>>n1>>n2>>tag>>rad;
	if(tag==2) swap(n1,n2);
	char c='0';
	for(int i=0;i<n2.size();i++) c=max(c,n2[i]);
	ll n1_val=cal(n1,rad);
	ll l=get(c)+1;
	ll r=max(l,n1_val);
	while(l<r){
		ll mid=l+r>>1;
		ll t=cal(n2,mid);
		if(t >= n1_val || t<0) r=mid; // long long 溢出后为负数 
		else l=mid+1; 
	}
	if(cal(n2,l)==n1_val) cout<<l<<endl;
	else cout<<"Impossible"<<endl;
	return 0;
}

posted @ 2020-12-01 21:36  Hyx'  阅读(143)  评论(0)    收藏  举报