一、题目描述

给定一个整数 n,需要找到两个整数 x 和 y,满足以下所有条件: x 和 y 的最大公约数(gcd)等于 n; x 不等于 y; 取值范围:1 ≤ x, y < 2^63; 在满足以上条件的前提下,让 x 和 y 的按位异或(⊕)结果尽可能小。

二、题目分析

因为 gcd(x, y) = n,说明 x 和 y 都是 n 的倍数(可以表示为 x = a×n、y = b×n,其中 a、b 是整数)。根据最大公约数的性质:gcd(x, y) = n × gcd(a, b)。要让 gcd(x, y) = n,必须满足 gcd(a, b) = 1(即 a 和 b 互质,没有除 1 之外的公约数)。

三、代码

#include <functional>
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<ll> vll;
#define endl '\n'

int main() {
    IOS;
    int T;
    cin >> T;  // 读取测试数据组数
    while (T--) {  // 循环处理每组数据
        ll n;
        cin >> n;  // 读取给定的整数n
        ll x = n << 32;  // x = n * 2^32(左移32位等价于乘2的32次方)
        ll y = x + n;    // y = n*2^32 + n(替代|符号,结果等价)
        cout << x << " " << y << endl;  // 输出x和y
    }
    return 0;
}

四、验证

验证 :输入 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(极小值)。