PAT甲组 1010 Radix (二分)
Posted friends-a
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT甲组 1010 Radix (二分)相关的知识,希望对你有一定的参考价值。
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
Sample Input 1:
6 110 1 10
Sample Output 1:
2
Sample Input 2:
1 ab 1 2
Sample Output 2:
Impossible
题意
给出两个正整数和其中一个数的基底,找到另一个数的基底,使两个数相等
思路
因为每个数不超过(10)位,每位最大都可能到z
,所以待求的基底可能是一个很大的数,用二分法求另一个数的基底。
将一直基底的数求出来之后,二分另一个数的基底。如果当前基底下的结果小于(0)或大于已知数,那么这个基底就是偏大的,一直二分直至相等,否则返回(-1)。
二分的左区间为待求基底的每位数字上最大值加一,右区间为max(左区间,已知数)
代码
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ms(a,b) memset(a,b,sizeof(a))
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=1e6+10;
const int mod=1e9+7;
const int maxm=1e3+10;
using namespace std;
ll get_num(string n,ll radix)
{
ll ans=0;
int l=n.length();
for(int i=l-1;i>=0;i--)
{
int res;
if(n[i]>='0'&&n[i]<='9')
res=n[i]-'0';
else
res=n[i]-'a'+10;
ans+=res*pow(radix,l-i-1LL);
}
return ans;
}
bool check(ll num,string n,ll radix)
{
ll res=get_num(n,radix);
if(num==res)
return true;
return false;
}
ll solve(ll num,string n)
{
ll l,r;
int low=0;
for(auto i:n)
{
if(i>='0'&&i<='9')
low=max(low,i-'0');
else
low=max(low,i-'a'+10);
}
l=low+1LL,r=max(1LL*l,num);
while(l<=r)
{
ll mid=(l+r)/2;
ll res=get_num(n,mid);
if(res<0||res>num)
r=mid-1;
else if(res<num)
l=mid+1;
else if(res==num)
return mid;
}
return -1;
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
srand((unsigned int)time(NULL));
#endif
ios::sync_with_stdio(false);
cin.tie(0);
string s1,s2;
int tag;
ll radix;
cin>>s1>>s2>>tag>>radix;
ll num1,num2;
if(tag==1)
{
num1=get_num(s1,radix);
if(solve(num1,s2)==-1)
cout<<"Impossible";
else
cout<<solve(num1,s2);
cout<<endl;
}
else
{
num2=get_num(s2,radix);
if(solve(num2,s1)==-1)
cout<<"Impossible";
else
cout<<solve(num2,s1);
cout<<endl;
}
#ifndef ONLINE_JUDGE
cerr<<"Time elapsed: "<<1.0*clock()/CLOCKS_PER_SEC<<" s.
";
#endif
return 0;
}
以上是关于PAT甲组 1010 Radix (二分)的主要内容,如果未能解决你的问题,请参考以下文章
PAT 1010 Radix (25分) radix取值无限制,二分法提高效率