1.题目大概
给你一个公约数n(1≤n<2^31 ),找到两个整数x,y;条件是x与y不相等,gcd(x,y)=n且1<=x,y<2^63;在以上条件的基础上,让x,y异或结果尽可能小。
2.题目分析
从题目给的两组例子可以看出异或的最小值就是n;因为n是x,y的最大公约数,所以x,y 都是n的倍数,那么如果n为01时,我的x,y可在后面加上很多个0(不超过31个)。
3.代码如下
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
int i;
for(i=0;i<t;i++)
{
long long n;
cin>>n;
long long a = n << 32; // 第一步:将n左移32位
long long b = (n << 32) | n; // 第二步:将n左移32位后,再与原n进行按位或运算
cout<<a<<" "<<b<<endl;
}
return 0;
}
4.验算
验证 :输入 n=2
计算:x = 2 << 32 = 2×2^32 = 8589934592,y = 8589934592 + 2 = 8589934594
条件gcd(8589934592, 8589934594): 8589934592 = 2×2^32,8589934594 = 2×(2^32+1);
2^32 和 2^32+1 互质,因此 gcd=2,符合要求; x≠y:8589934592 ≠ 8589934594
符合要求; 异或结果:8589934592 ⊕ 8589934594 = 2(极小值)。

京公网安备 11010502036488号