一、题目描述
给定一个整数 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(极小值)。

京公网安备 11010502036488号