博主心态炸了…本题差一个点没有A,得了24分。有一个点超时,根据网上大佬的题解,应该在遍历进制采用二分的方法。
说一下题意
就是给你四个数 n1,n2,tag,radix;
意思是第tag个数 是radix进制的,然后问你有没有可能n2是x进制的,让n1==n2成立 求x,若没有,输出impossible。
看上去是暴力题,但是有一个很坑的地方,题目虽说给定n每一位都是小于35的。但是所求的x进制却未必是小于35进制的,也有可能是100000进制数。所以遍历时不能简单从2遍历到35;而是从最高位+1遍历到已给的n是10进制值+1。什么意思呢。比如说给定数据 6 4 1 10,6为10进制,求一下在多少进制情况下,4可以等6。首先下边界为4,因为n2的一位已经是4了,所以肯定不能是4以下的进制,只能是5、6更高的进制,再说一下上边界。 既然给定n1 = 6,那么n2的进制一定不能超过n1。如果超过n1 那么n2为任意数值都会比n1大,于是不符合题意。所以循环边界(所求数最高位+1,已给数的十进制+1),在这个区间内进行二分查找即可求得结果。
贴一下我没有使用二分查找24分的代码。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char N[3][15],rr[10];
int tag,radix;
ll sum,ans;
int main()
{
scanf("%s%s%d%d",N[1],N[2],&tag,&radix);
for(int i=strlen(N[tag]) - 1;i>=0;i--)
{
if(N[tag][i] >= 'a' && N[tag][i] <= 'z')
sum += ((N[tag][i] - 'a' + 10) * pow(radix,strlen(N[tag])-1-i));
else
sum += ((N[tag][i] - '0') * pow(radix,strlen(N[tag])-1-i));
}
int t = tag == 1 ? 2 : 1;
int imax = -1;
for(int i=strlen(N[t]) - 1;i>=0;i--)
{
if(N[t][i] >= 'a' && N[t][i] <= 'z')
{
if(N[t][i] - 'a' + 10 > imax)
imax = N[t][i] - 'a' + 10;
}
else{
if(N[t][i] - '0' > imax)
imax = N[t][i] - '0';
}
}
for(ll r=imax+1;r<=sum+1;r++)
{
ans = 0;
for(int i=strlen(N[t]) - 1;i>=0;i--)
{
if(N[t][i] >= 'a' && N[t][i] <= 'z')
ans += ((N[t][i] - 'a' + 10) * pow(r,strlen(N[t])-1-i));
else
ans += ((N[t][i] - '0') * pow(r,strlen(N[t])-1-i));
}
if(ans == sum)
{
printf("%lld\n",r);
return 0;
}
}
printf("Impossible\n");
}