ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

A1010

2020-01-15 09:02:47  阅读:225  来源: 互联网

标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有