标签:cout present The cup cpp with test hat sample
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.
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\).
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.
6 110 1 10
2
1 ab 1 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.\n";
#endif
return 0;
}
标签:cout present The cup cpp with test hat sample
原文地址:https://www.cnblogs.com/Friends-A/p/12290587.html