luoguP1555 尴尬的数字(暴力+map)
题意
题解
枚举每一个可能的二进制数。扔到一个map里
再枚举每一个可能的三进制数看map有没有就行了
反正就是很水
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmath> 5 #include<algorithm> 6 #include<map> 7 using namespace std; 8 map<long long,bool>ma; 9 char s1[20000],s2[20000]; 10 long long ksm(long long x,long long b){ 11 long long tmp=1; 12 while(b){ 13 if(b&1){ 14 tmp*=x; 15 } 16 b>>=1; 17 x=x*x; 18 } 19 return tmp; 20 } 21 void work(char s[]){ 22 long long len=strlen(s+1); 23 long long tmp=0; 24 for(long long i=1;i<=len;i++){ 25 tmp=tmp*2+s[i]-'0'; 26 } 27 for(long long i=1;i<=len;i++){ 28 long long ans=tmp+(((s[i]-'0')^1)-(s[i]-'0'))*(1<<len-i); 29 ma[ans]=1; 30 } 31 } 32 void work1(char s[]){ 33 long long len=strlen(s+1); 34 long long tmp=0; 35 for(long long i=1;i<=len;i++){ 36 tmp=tmp*3+s[i]-'0'; 37 } 38 for(long long i=1;i<=len;i++){ 39 for(long long j=0;j<=2;j++){ 40 if(j==s[i]-'0')continue; 41 long long ans=tmp+(j-(s[i]-'0'))*ksm(3,len-i); 42 if(ma[ans]==1){ 43 printf("%lld",ans); 44 return ; 45 } 46 } 47 } 48 } 49 int main(){ 50 scanf("%s",s1+1); 51 scanf("%s",s2+1); 52 work(s1); 53 work1(s2); 54 return 0; 55 }