1010 Radix (25 分)(溢出,二分)

Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is yes, if 6 is a decimal number and 110 is a binary number.

Now for any pair of positive integers N​1​​ and N​2​​, your task is to find the radix of one number while that of the other is given.

Input Specification:

Each input file contains one test case. Each case occupies a line which contains 4 positive integers:


N1 N2 tag radix

Here N1 and N2 each has no more than 10 digits. A digit is less than its radix and is chosen from the set { 0-9, a-z } where 0-9 represent the decimal numbers 0-9, and a-z represent the decimal numbers 10-35. The last number radix is the radix of N1 if tag is 1, or of N2 if tag is 2.

Output Specification:

For each test case, print in one line the radix of the other number so that the equation N1 = N2 is true. If the equation is impossible, print Impossible. If the solution is not unique, output the smallest possible radix.

Sample Input 1:

6 110 1 10

Sample Output 1:

2

Sample Input 2:

1 ab 1 2

Sample Output 2:

Impossible
#include<bits/stdc++.h>
#pragma GCC optimize(3)
#define max(a,b) a>b?a:b
using namespace std;
typedef long long ll;
const int N=20;
char a[N],b[N];
int flag,radix;
inline int get_num(char ch){
	return ch>='0'&&ch<='9'?ch-'0':ch-'a'+10;
} 
ll S_L(char s[],ll radix){
	ll num=0;
	int len=strlen(s);
	for(int i=0;i<len;i++) num+=get_num(s[i])*pow(radix,len-i-1);
	return num;
}
void solve(char s[],ll num){
	int mx=0,len=strlen(s);
	for(int i=0;i<len;i++) mx=max(mx,get_num(s[i]));
	ll l=mx+1,r=1e18,mid;
	while(l<=r){
		mid=(l+r)>>1;
		ll tmp=S_L(s,mid);
		if(tmp>0&&tmp<num) l=mid+1;
		else r=mid-1;
	}
	if(S_L(s,l)!=num) printf("Impossible\n");
	else printf("%lld\n",l); 
}
int main(){
    scanf("%s%s%d%d",a,b,&flag,&radix);
    if(flag==1) solve(b,S_L(a,radix));
    else solve(a,S_L(b,radix));
    return 0;
}





发布了415 篇原创文章 · 获赞 47 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_42936517/article/details/103342795
今日推荐