给出两个数和一个数的进制,求使两个数相等的另一个数的进制
这道题真的是各种坑了
以下做法,要是不加这段代码就过不了第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,但是哪种方法都很强行啊⊙﹏⊙