一道简单的二分,虽然wa了。。。
注意数据范围,int肯定会爆,long long 可能也会爆
然后二分的check函数也不用写,直接放循环里面就好了。
我也懒得debug了www完全不知道错哪了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#define FOR(i,a,n) for (int i=a;i<n;i++)
#define FRO(i,n,a) for (int i=n;i>a;i--)
#define mst(a,i) memset(a,i,sizeof a)
#define pb push_back
#define fi first
#define se second
#define pi pair<int,int>
#define eps 1e-6
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
const int mod = 1000000007;
int dir[4][2]={0,1,1,0,0,-1,-1,0};
const int N = 1e5+6;
// const int MAXN=1e4;
// int a[N]={};
// int b[N]={};
ll decode(char c)
{
if(isdigit(c))return c - '0';
else if(islower(c))return c - 'a' + 10;
}
ll toDe(string s , ll rdx)
{
ll res = 0;
ll mm = 1;
FRO(i,s.size() - 1 , -1)
{
res += mm * decode(s[i]);
mm *= rdx;
}
return res;
}
ll bbsearch(ll de_sum , string n2 , ll l , ll r)
{
while(l < r)
{
// cout << l << "||" << r << '\n';
ll mid = (l + r) >> 1;
// cout << toDe(n2,mid) << '\n';
if(de_sum > toDe(n2,mid))
{
l = mid + 1;
}
else if(de_sum < toDe(n2,mid))
{
r = mid;
}
else
{
// cout << mid << '\n';
return mid;
}
}
return -1;
}
int main(){
IOS
string n1 , n2;
ll tag , rdx;
cin >> n1 >> n2;
cin >> tag >> rdx;
if(tag == 2)
{
swap(n1,n2);
}
ll de_sum = toDe(n1,rdx);
ll ans = bbsearch(de_sum , n2 , 1 , 36);
if(ans > 0)
cout << ans << '\n';
else if(ans == -1)
cout << "Impossible" << '\n';
return 0;
}