【题解】1010 Radix (25 分)⭐⭐⭐ 【二分 进制转换】
发布日期:2021-06-29 16:19:11 浏览次数:2 分类:技术文章

本文共 1485 字,大约阅读时间需要 4 分钟。

在这里插入图片描述

Input

在这里插入图片描述

Output

在这里插入图片描述

Examples

Sample Input 1:

6 110 1 10
Sample Output 1:
2
Sample Input 2:
1 ab 1 2
Sample Output 2:
Impossible

Hint

题意:

给出2个数,一个标记t和进制r,对应标记的数为r进制,求两数相等时,另一个数的最小进制

题解:

原本以为是暴力无脑进制转换,后来发现还是有一点小技巧

首先数据比较大,直接暴力有2组数据过不去,需要二分优化
其次二分时会爆long long,要判断>0的情况(即溢出)

#include
using namespace std;#define ms(x, n) memset(x,n,sizeof(x));typedef long long LL;const int INF = 1 << 30;const int MAXN = 1e5+10;LL RTranTo10(int r, string s){
LL res = 0; int len = s.length(); for(int i = 0; i < len; ++i){
if(s[i] >= '0' && s[i] <= '9') res += (s[i]-'0')*pow(r, len-1-i); else res += (s[i]-'a'+10)*pow(r, len-1-i); } return res;}int solve(LL n, string s){
int maxn = 1; for(int i = 0; i < s.length(); ++i){
if(isdigit(s[i])) maxn = max(maxn, s[i]-'0'); else maxn = max(maxn, s[i]-'a'+10); } LL l = maxn+1, r = max(l, n)+1, mid, tmp; while(l < r){
mid = (l+r)/2, tmp = RTranTo10(mid, s); if(tmp < 0 || tmp > n) r = mid; //tmp<0是判断tmp爆longlong溢出了,太坑了 else if(tmp < n) l = mid+1; else return mid; } return -1;}int main() {
ios::sync_with_stdio(false); string n1, n2; int tag, r, ret; cin >> n1 >> n2 >> tag >> r; if(tag == 1) ret = solve(RTranTo10(r, n1), n2); else ret = solve(RTranTo10(r, n2), n1); if(ret == -1) cout << "Impossible\n"; else cout << ret << endl; return 0;}

转载地址:https://suprit.blog.csdn.net/article/details/103358142 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:VTK:可视化算法之PineRootDecimation
下一篇:VTK:可视化算法之PineRootConnectivity

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月26日 09时12分01秒