题意:
输入两个数可能包含小写字母,1或者2,进制大小。第三个数为代表第一个数是第四个数进制的,求第二个数等于第一个数时进制的大小,不可能则输出Impossible,第三个数为2代表第二个数是第四个数进制的,求第一个数等于第二个数时进制的大小,不可能则输出Impossible。数字的位数最多是十位。
trick:
进制可能很大,所以运算过程中可能会爆long long,不必担心,当成负数处理即可。
AAAAAccepted code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 string s1,s2; 4 long long t,rad; 5 int main(){ 6 cin>>s1>>s2>>t>>rad; 7 if(t==2) 8 swap(s1,s2); 9 long long num1=0,num2=0; 10 int len1=s1.size(),len2=s2.size(); 11 for(int i=0;i<len1;++i){ 12 num1*=rad; 13 if(s1[i]>='0'&&s1[i]<='9') 14 num1+=s1[i]-'0'; 15 else 16 num1+=s1[i]-'a'+10; 17 } 18 int mx=0; 19 for(int i=0;i<len2;++i) 20 if(s2[i]>='0'&&s2[i]<='9') 21 mx=max(mx,s2[i]-'0'); 22 else 23 mx=max(mx,s2[i]-'a'+10); 24 long long l=mx+1; 25 long long r=max(l,num1); 26 long long mid=0; 27 while(l<=r){ 28 mid=(l+r)>>1; 29 string x=s2; 30 long long tmp=0; 31 for(int i=0;i<len2;++i){ 32 tmp*=mid; 33 if(x[i]>='0'&&x[i]<='9') 34 tmp+=x[i]-'0'; 35 else 36 tmp+=x[i]-'a'+10; 37 } 38 if(tmp>num1||tmp<0)//顺序写反会错 39 r=mid-1; 40 else if(tmp<num1)//顺序写反会错,因为溢出的话tmp小于0,一定小于num1 41 l=mid+1; 42 else{ 43 cout<<mid; 44 return 0; 45 } 46 } 47 cout<<"Impossible"; 48 return 0; 49 }