刷题向 | 1010 Radix

 

 

给出两个数和一个数的进制,求使两个数相等的另一个数的进制

 

 

这道题真的是各种坑了

以下做法,要是不加这段代码就过不了第10个测试点

if(strcmp(n[tag],n[t])==0){
		printf("%d",radix);
		return 0;
	}

难道是因为有多种可能性二分的时候没有选择到最小的?

可是8 8 1 10 加了以上的代码答案是10,可是按题意答案应该是9啊,超级懵逼了

#include<stdio.h>
#include<vector>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<limits>
#include<fstream>
#include<math.h>
#include<stack>
#include<queue>
#include<bitset>
#include<utility>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N=105;
const ll mod=1e9+7;
const int M=1005;
char n[3][15];
ll m[3];
int tag;
ll radix;
ll bin_search(int t,ll lp,ll rp){
	if(lp>rp)return -1;
	m[t]=0;
	ll r=1;
	ll ar=(lp+rp)/2;
	for(int i=strlen(n[t])-1;i>=0;i--){
		if(n[t][i]>='0'&&n[t][i]<='9'){
			m[t]+=(n[t][i]-'0')*r;
		}
		else{
			m[t]+=((n[t][i]-'a')+10)*r;
		}
		if(m[t]>m[tag]){
			return bin_search(t,lp,ar-1);
		}//防溢出 
		r*=ar;
	}
	if(m[t]>m[tag]){
		return bin_search(t,lp,ar-1);
	}
	else if(m[t]<m[tag]){
		return bin_search(t,ar+1,rp);
	}
	else return ar;
}

int main(){
	scanf("%s%s%d%lld",&n[1],&n[2],&tag,&radix);
	//cout<<n[1]<<endl<<n[2]<<endl;
	m[1]=0;
	m[2]=0;
	ll r=1;
	for(int i=strlen(n[tag])-1;i>=0;i--){
		//cout<<n[tag][i]<<endl;
		if(n[tag][i]>='0'&&n[tag][i]<='9'){
			m[tag]+=(n[tag][i]-'0')*r;
		}
		else{
			m[tag]+=((n[tag][i]-'a')+10)*r;
		}
		r=r*radix;
	}
	int ar=1;
	int t;
	if(tag==1)t=2;
	else t=1;
	if(strcmp(n[tag],n[t])==0){
		printf("%d",radix);
		return 0;
	}
	for(int i=strlen(n[t])-1;i>=0;i--){
		if(n[t][i]>='0'&&n[t][i]<='9'){
			ar=max(ar,n[t][i]-'0');
		}
		else{
			ar=max(ar,(n[t][i]-'a')+10);	
		}
	}
	ar+=1;
	ll ans=bin_search(t,ar,m[tag]+1);
	if(ans==-1){
		printf("Impossible");
	}
	else printf("%lld",ans);
    return 0;
}

这道题一开始会很容易以为上限是36,其实并不是啊!!!如果从2开始遍历,遍历上限定为50,测试点7会超时,为了过测试点7,强行让它再做一次二分,也可以A

#include<stdio.h>
#include<vector>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<limits>
#include<fstream>
#include<math.h>
#include<stack>
#include<queue>
#include<bitset>
#include<utility>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N=105;
const ll mod=1e9+7;
const int M=1005;
char n[3][15];
ll m[3];
int tag;
ll radix;
ll bin_search(int t,ll lp,ll rp){
	if(lp>rp)return -1;
	m[t]=0;
	ll r=1;
	ll ar=(lp+rp)/2;
	for(int i=strlen(n[t])-1;i>=0;i--){
		if(n[t][i]>='0'&&n[t][i]<='9'){
			m[t]+=(n[t][i]-'0')*r;
		}
		else{
			m[t]+=((n[t][i]-'a')+10)*r;
		}
		r*=ar;
	}
	if(m[t]>m[tag]){
		return bin_search(t,lp,ar-1);
	}
	else if(m[t]<m[tag]){
		return bin_search(t,ar+1,rp);
	}
	else return ar;
}

int main(){
	scanf("%s%s%d%lld",&n[1],&n[2],&tag,&radix);
	//cout<<n[1]<<endl<<n[2]<<endl;
	m[1]=0;
	m[2]=0;
	ll r=1;
	for(int i=strlen(n[tag])-1;i>=0;i--){
		//cout<<n[tag][i]<<endl;
		if(n[tag][i]>='0'&&n[tag][i]<='9'){
			m[tag]+=(n[tag][i]-'0')*r;
		}
		else{
			m[tag]+=((n[tag][i]-'a')+10)*r;
		}
		r=r*radix;
	}
	//cout<<m[tag]<<endl; 
	int ar=1;
	int t;
	if(tag==1)t=2;
	else t=1;
	for(int i=strlen(n[t])-1;i>=0;i--){
		if(n[t][i]>='0'&&n[t][i]<='9'){
			ar=max(ar,n[t][i]-'0');
		}
		else{
			ar=max(ar,(n[t][i]-'a')+10);	
		}
	}
	ar+=1;
	ll lp=ar;
	bool f=1;
	while(f){
		m[t]=0;
		r=1;
		for(int i=strlen(n[t])-1;i>=0;i--){
			if(n[t][i]>='0'&&n[t][i]<='9'){
				m[t]+=(n[t][i]-'0')*r;
			}
			else{
				m[t]+=((n[t][i]-'a')+10)*r;
			}
			r*=ar;
		}
		if(m[t]>m[tag]||ar>50){
			f=0;
			break;
		}
		if(m[t]==m[tag]){
			break;
		}
		ar++;
	}
	if(ar>50){
		ll ans=bin_search(t,lp,m[tag]+1);
		if(ans==-1){
			printf("Impossible");
		}
		else printf("%lld",ans);
		return 0;
	}
	if(f==0){
		printf("Impossible");
	}
	else printf("%d",ar);
    return 0;
}

虽然都能A,但是哪种方法都很强行啊⊙﹏⊙

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bekote

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值