pat甲级1010

题意:给两个数,tags指明一个数的进制。问另外一个数是多少的时候两个数相等。给定的数最多是1e15,所以long long 可以存下。第二个数的进制可能非常大,比如第二个数是10,第一个数是1e10。那么第二个数进制是1e10的时候连个数是相等的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87

const int N=1005;
const int inf= 0x3f3f3f3f;
typedef long long ll;
using namespace std;
map<char, ll> to;

ll (char str[], ll base){
ll ret=0;
for(int i=0; str[i]; i++){
ret=ret*base + to[str[i]];
}

return ret;
}

int check(char s[], ll base, ll tar){
ll num=0;
for(int i=0; s[i]; i++){
num=num*base+to[s[i]];
if(num>tar) return 1;
if(num<0) return 1;
}
if(num<tar) return -1;
return 0;

}

ll binarySearch(char s[], ll l, ll r, ll tar){

while(l<=r){
ll mid=(l+r)>>1;

int flag=check(s, mid, tar);

if(flag>=0)
r=mid-1;
else if(flag<0)
l=mid+1;
}

if(check(s, l, tar)==0) return l;

return -1;
}

int main () {
char num1[20], num2[20], tmp[20];
int kd;
ll base;

for(int i=0; i<10; i++) to['0'+i]=i;
for(char i='a'; i<='z' ; i++)
to[i]=i-'a'+10;

while(~scanf("%s", num1)){
scanf("%s", num2);
int len1=strlen(num1);
int len2=strlen(num2);
scanf("%d%lld", &kd, &base);

if(kd==2){
strcpy(tmp, num1);
strcpy(num1, num2);
strcpy(num2, tmp);
}

ll tar=0;
tar=getVal(num1, base);

ll low=2;
int i=0;
while(num2[i]) low=max(to[num2[i++]]+1, low);

ll ans=binarySearch(num2, low, tar+1, tar);

if(ans==-1){
puts("Impossible");
}
else{
printf("%lldn", ans);
}

}

return 0;
}