给出两个数,已知一个数的进制,求是否可以在某进制下两数相等。
此题有个坑,进制在35以内,但是求的进制是远大于35
穷举法可以过大部分数据,第7个数据不能过,所以就先穷举,特殊值在二分
View Code
#include<stdio.h> #include<iostream> #include<stack> #include<math.h> #include<string.h> using namespace std; int main() { char s1[19],s2[19],st[19]; int tag,radix,max=0; scanf("%s",s1); scanf("%s",s2); scanf("%d%d",&tag,&radix); if(tag==2){ strcpy(st,s1); strcpy(s1,s2); strcpy(s2,st); } long long i,add1,add2,k,temp; long long all1=0,all2=0; for(i=0;s1[i];i++);add1=i; for(i=0;s2[i];i++){ if(s2[i]<='9')temp=s2[i]-'0'; else temp=s2[i]-'a'+10; if(max<temp)max=temp; }add2=i; for(i=add1-1;i>=0;i--){ if(s1[i]<='9'){ all1+=(s1[i]-'0')*(long long)pow(1.0*radix,1.0*(add1-i-1)); } else{ all1+=(s1[i]-'a'+10)*(long long)pow(1.0*radix,1.0*(add1-i-1)); } } // printf("%lld",all1); for(k=max+1;k<=1000000;k++){ all2=0; for(i=add2-1;i>=0;i--){ if(s2[i]<='9'){ all2+=(s2[i]-'0')*(long long)pow(1.0*k,1.0*(add2-i-1)); temp=s2[i]-'0'; } else{ all2+=(s2[i]-'a'+10)*(long long)pow(1.0*k,1.0*(add2-i-1)); temp=s2[i]-'a'+10; } } if(all2<0){//溢出的时候特殊处理 printf("Impossible\n"); return 0; } if(all1==all2)break; } if((k<=1000000)&&(all1==all2)) printf("%d\n",k); else { long long ll=1000000,mid,rr=10000000000; while(ll<=rr)//特殊数据特殊处理2分 { k=(ll+rr)/2; all2=0; for(i=add2-1;i>=0;i--){ if(s2[i]<='9'){ all2+=(s2[i]-'0')*(int)pow(1.0*k,1.0*(add2-i-1)); temp=s2[i]-'0'; } else{ all2+=(s2[i]-'a'+10)*(int)pow(1.0*k,1.0*(add2-i-1)); temp=s2[i]-'a'+10; } } if(all1==all2)break; if(all2<0)rr=k-1; else{ if(all2>all1)rr=k-1; else ll=k+1; } } if(all1==all2) printf("%d\n",k); else printf("Impossible\n"); } return 0; }