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; }
|
近期评论