A1010
Posted tao7
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A1010相关的知识,希望对你有一定的参考价值。
#include<iostream> #include<cstdio> #include<cctype> #include<math.h> #include <algorithm> using namespace std; long long loop(string s,long long min,long long sum1){ long long max=sum1,sum2=0; while(max>=min){ long long mid=(max+min)/2; long long rad=1; sum2=0; for(int i=s.length()-1;i>=0;i--){ sum2+=(long long)((s[i]-‘0‘>9?s[i]-‘a‘+10:s[i]-‘0‘)*rad); rad*=mid; } if(sum2>sum1||sum2<0) max=mid-1; else if(sum2<sum1) min=mid+1; else return mid; } return -1; } int main(){ string s1,s2; int tag; long long rad=1,radix; cin>>s1>>s2>>tag>>radix; if(tag==2) swap(s1,s2); long long sum1=0; for(int i=s1.length()-1;i>=0;i--){ sum1+=(long long)(s1[i]-‘0‘>9?s1[i]-‘a‘+10:s1[i]-‘0‘)*rad; rad*=radix; } char c=*max_element(s2.begin(),s2.end()); long long min=(c-‘0‘>9?c-‘a‘+10:c-‘0‘); if(loop(s2,min+1,sum1)==-1) cout<<"Impossible"; else cout<< loop(s2,min+1,sum1); return 0; }
开始使用的是for的暴力枚举,但是在最终会有一个测试点没法通过,一个测试点运行超时,于是就按照网上大多数的方法采用二分查找,但是还是有一个测试点无法通过,我已经考虑到了数值溢出的情况了啊
以上是关于A1010的主要内容,如果未能解决你的问题,请参考以下文章