题目大意: 给出一个整数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;
}