【溢出值】 Radix
传送门
题意
给定一\(n_{1},n_{2},tag,radix\),分别别是两个数字,\(radix\)是一个数字表示进制,\(tag=1\)则表示\(n_{1}\)的进制,\(tag=2\)则表示\(n_{2}\)的进制,
求一个进制满足\(n_{2}\)在此进制下的数字等于\(n_{1}\),不存在输出Impossible
数据范围
每一位数字可能是0-9、a-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;
}

浙公网安备 33010602011771号