题目大意: 给出一个整数n,在满足 gcd(𝑥,𝑦)=𝑛,𝑥≠𝑦且1≤𝑥,𝑦<2^63的基础上,使得x⊕y最小。 (gcd是最大公约数,⊕是位运算中的按位异或)
解题思路: 由题可知,x和y均为n的倍数,即x=an,y=bn。根据位运算中的按位异或性质可知“异或”相当于一种“不退位的减法”,故而x⊕y>=|x-y|,即x⊕y>=|(a-b)n|,因为题目要求最小值,并且x!=y,所以|a-b|=1,x⊕y=n。所以我们只要设法让a和b不相同的部分变成差值n就可以了。观察题目给出的数据范围提示:n(1≤n<2^31),我们可以直接将x等于n左移31位,相当于将后面全部补为0,然后y=x+n,这样前面都相同,只有后边的n的部分不相同,而异或的性质“异1同0”得到的就是n了。
参考代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll t;
cin>>t;
for(int k=0;k<t;k++){
ll n;
cin>>n;
ll x=(n<<31);
ll y=x+n;
cout<<x<<' '<<y<<'\n';
}
return 0;
}



京公网安备 11010502036488号