1010 Radix (25 point(s))

题解

二分查找

#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<cctype>
#include<algorithm>
using namespace std;
typedef long long LL;
LL getDec(string s, const int& radix) {
	LL ret = 0;
	reverse(s.begin(), s.end());
	for(int i = 0; i < s.length(); ++i) {
		LL a;
		if(isalpha(s[i])) a = s[i] - 'a' + 10;
		else a = s[i] -'0';
		ret += a * pow(radix, i); 
	}
	return ret;
}
LL getMinRadix(const string& s) {
	LL minRadix = -1;
	for(int i = 0; i < s.length(); ++i) {
		LL a;
		if(isalpha(s[i])) a = s[i] - 'a' + 10;
		else a = s[i] - '0';
		minRadix = max(minRadix, a);
	}
	return minRadix + 1; // 最小的数+1为下界 
}
LL bSearch(LL l, LL r, const LL& num, const string& s) {
	while(l < r) {
		LL m = l + (r - l) / 2;
		LL t = getDec(s, m);
		if(num == t) return m;
		else if(num < t || t < 0) r = m; // 别忘记考虑t溢出变负值的情况。。。 
		else l = m + 1;
	}
	return -1;
}
int main() {
	string n1, n2;
	int tag, radix;
	cin >> n1 >> n2 >> tag >> radix;
	if(tag == 2) swap(n1, n2);
	LL num = getDec(n1, radix);
	LL l = getMinRadix(n2);
	LL r = max(l, num) + 1; // +1   [l, r) bsearch 
	int flag = bSearch(l, r, num, n2);
	if(flag == -1) printf("Impossible");
	else printf("%lld", flag);
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值