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(极小值)。