题意极坑
他有毒!!!
题意:给出来N1,N2,tag,radix四个数,其中tag=1时radix表示n1的进制,等于2时表示N2的进制,然后他说给出来的是N1只能从0-9,a-z里面取值,长度还是10,当时一想,哇,这直接暴力不就可以了么,然后就乐呵呵的去做了,wa到哭之后翻了大佬的博客,才知道,虽然N1取值可以很小,但是他radix可以给你搞个759432758进制啊!!!!
然后使用二分解决的
据说会爆long long,用了unsigned long long
七凑八凑终于把所有的点都凑过了,泪流满面
腆着脸贴一贴我凑出来的代码
#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <cstdio>
#include<algorithm>
#include <cmath>
#define LL unsigned long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 2e3+7;
LL radix(char ch[], int x)
{
int l = strlen(ch);
LL ans = 0;
for(int i = 0; i < l; i ++)
{
if('0' <= ch[i] && ch[i] <= '9')
ans = ans * x + ch[i]-'0';
else
ans = ans * x + ch[i] - 'a' + 10;
}
// cout << " ans " << ans << endl;
return ans;
}
int main()
{
char n1[50],n2[50],temp[50];
LL tag,rad,n;
cin >> n1 >> n2 >> tag >> rad;
bool p = false;
LL ans = 0;
if(tag == 2)//如果tag=2,就互换一下,相当于tag=1了
{
strcpy(temp,n1);
strcpy(n1,n2);
strcpy(n2,temp);
}
n = radix(n1,rad);
int maxn2 = 0;
for(int i = 0; i < strlen(n2); i ++)//计算出n2中每一位数中的最大值,即为所求进制的范围中最小值【下限】
{
if(n2[i]<='9' &&n2[i] >='0')maxn2 = max(n2[i]-'0',maxn2);
if(n2[i]<='z' &&n2[i] >='a')maxn2 = max(n2[i]-'a'+10,maxn2);
}
LL l = maxn2+1, r = n;//所求进制肯定不能超过n,所以上限设置成n
while(l <= r)
{
LL mid = (l+r)/2;
LL t = radix(n2,mid);
if(t == n)
{
//l = r = mid;
ans = mid;
p = true;
break;
}
else if(t > n)
{
r = mid - 1;
}
else
{
l = mid+1;
}
}
//if(radix(n2,l) == n) cout << l <<endl;
if(p) cout << ans << endl;
else if(radix(n2,l) == n)cout << l << endl;//考虑一下 110 6 1 2 的情况
else cout << "Impossible" << endl;
return 0;
}