标签:rad min s1 sum2 sum1 long 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的暴力枚举,但是在最终会有一个测试点没法通过,一个测试点运行超时,于是就按照网上大多数的方法采用二分查找,但是还是有一个测试点无法通过,我已经考虑到了数值溢出的情况了啊
标签:rad,min,s1,sum2,sum1,long,A1010 来源: https://www.cnblogs.com/tao7/p/12194918.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。