题意: 给你一个二进制数,一个三进制数,
二进制一个位数错了,三进制也一个位数错了。
问你这个数原来的数是多少。
题解:
暴力枚举,用map 记录。
#include<cstdio>
#include<queue>
#include<string>
#include<vector>
#include<cstring>
#include<map>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=10020;
const int inf=0;
ll p3[100];
ll p2[100];
map<ll,int>mm;
int main(){
p3[0]=p2[0]=1;
for(int i=1;i<30;++i) p3[i]=p3[i-1]*3;
for(int i=1;i<60;++i) p2[i]=p2[i-1]*2;
int t,flag=0,ans;
char a[100],b[100];
int aa[100];
scanf("%d",&t);
while(t--){
flag=0;
scanf("%s",a);
scanf("%s",b);
int lena=strlen(a);
int lenb=strlen(b);
for(int i=0;i<lena;++i) a[i]-='0';
for(int i=0;i<lenb;++i) b[i]-='0';
for(int j=lenb-1;j>=0;j--){
int su=0,f=0;
for(int k=lenb-1;k>=0;k--){
if(k==j){
f=k;
}
else su+=p3[lenb-k-1]*b[k];
}
for(int k=0;k<3;++k){
if(k==b[f]) continue;
mm[su+p3[lenb-f-1]*k]=1;
}
}
for(int i=lena-1;i>=0;i--){
ans=0;
for(int j=lena-1;j>=0;j--){
if(j==i){
if(a[j]==0) ans+=1<<(lena-j-1);
}else{
ans+=a[j]<<(lena-j-1);
}
}
if(mm[ans]) break;
}printf("%d\n",ans);
}
return 0;
}