题解
- 这一题的坑比较多,刚开始看到这题以为默认36进制以内,for循环一遍错了7、8个,实际上这个题的进制范围可以很大,但是当两个数都不为0时,一个数的进制不会超过另一个数的10进制表示(一个数不为0那么最小也是1,如果进制大于另一个数的10进制表示,那么两个数不可能相等)
- 这题的数据最好都用long long,int可能会溢出
- 进制是有下界的,比如说一个数的表示出现了‘a’,那么进制最小也应该是11进制,10进制下不可能有‘a’
- for循环一遍会超时(卡第7个测试点),二分法可以AC
AC代码
#include <iostream>
#define LL long long
using namespace std;
LL radixto10(LL radix, string s);
LL Binary_search(LL start, LL inf, string s, LL sum);
int main()
{
string s1, s2;
LL sum=0, tag, radix, ans;
cin >> s1 >> s2 >>tag >> radix;
if (tag==1)
{
sum = radixto10(radix,s1);
s1 = s2;
}
else
sum = radixto10(radix,s2);
LL start=2, inf;
for (int i=0; i<s1.length(); i++)
{
if (s1[i]>='a')
{
if (int(s1[i]-'W')>=start)
start = int(s1[i]-'W')+1;
}
else
{
if (int(s1[i]-'0')>=start)
start = int(s1[i]-'0')+1;
}
}
inf = start;
while (radixto10(inf,s1)<=sum && inf <= sum)
inf *= 2;
ans = Binary_search(start, inf, s1, sum);
if (ans!=0)
cout << ans;
else
cout << "Impossible";
return 0;
}
LL radixto10(LL radix, string s)
{
LL sum=0;
for (int i=0; i<s.length(); i++)
{
if (s[i]>='a')
sum = sum*radix+int(s[i]-'W');
else
sum = sum*radix+int(s[i]-'0');
}
return sum;
}
LL Binary_search(LL start, LL inf, string s, LL sum)
{
if (inf < start)
return 0;
LL mid = (start+inf)/2;
LL tmp = radixto10(mid, s);
if (start==inf && tmp!=sum)
return 0;
else if (tmp == sum)
return mid;
else if (tmp > sum)
{
inf = mid-1;
return Binary_search(start,inf,s,sum);
}
else
{
start = mid+1;
return Binary_search(start,inf,s,sum);
}
}
end