题意: 解法: 由于只能翻转相邻的三个二进制位, 因此当x位置缺少0或1的时候,一定是从x+2,x+4,x+6...位置来的. 扫描二进制位,每次遇到x和y二进制位不同的位置, 贪心地向右+2,+2,+2找到第一个可以换过来的位置即可. 复杂度O(n^2),其中n是二进制长度60. code: #include <bits/stdc++.h> using namespace std; #define int long long const int maxm=1e5+5; int cas=1; int x,y; void solve(){ int x,y;cin>>x>>y; cout<<"Case "<<cas++<<": "; int ans=0; for(int i=0;i<=60;i++){ if((x>>i&1)!=(y>>i&1)){ for(int j=i+2;j<=60;j+=2){ if((x>>j&1)!=(x>>i&1)){ x^=(1LL<<i); x^=(1LL<<j); ans+=(j-i)/2; break; } } } } if(x!=y){ cout<<-1<<endl; return ; } cout<<ans<<endl; } signed main(){ ios::sync_with_stdio(0); int T;cin>>T; while(T--){ solve(); } return 0; }