题解 | #比赛安排(PDF题面存放于本题)#
比赛安排(PDF题面存放于本题)
https://ac.nowcoder.com/acm/contest/120562/A
解题思路
这道题的核心是找到满足 gcd(x, y) = n 且 x ⊕ y 最小的两个数 x 和 y。我们可以通过聪明的大脑来转化问题 转化问题:由于 gcd(x, y) = n,我们可以设 x = n * a,y = n * b,其中 gcd(a, b) = 1 且 a ≠ b。此时,x ⊕ y = (na) ⊕ (nb)。我们的目标转化为找到 a 和 b,使得这个异或值最小。 最小异或值:两个不同数的最小非零异或值是 1,这发生在两个数相邻(如 k 和 k+1)时,且相邻数必然互质。因此,我们需要找到 a 和 b 使得 a ⊕ b = 1,并让 (na) ⊕ (nb) 最小。 分情况讨论: 当 n 是 2 的幂 时(即 n & (n-1) == 0),选择 a=2,b=3。此时 x=2n,y=3n,gcd(x,y)=n,且 x ⊕ y = n,这是最小的可能值。 当 n 不是 2 的幂 时,找到大于 n 的最小的 2 的幂 m,选择 a=m,b=m+1。此时 x=m*n,y=(m+1)*n,gcd(x,y)=n,且 x ⊕ y = n,同样达到最小异或值。
示例代码
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) {
long long n;
cin >> n;
if ((n & (n - 1)) == 0) {
cout << 2 * n << " " << 3 * n << "\n";
} else {
long long m = 1;
while (m <= n) {
m <<= 1;
}
cout << m * n << " " << (m + 1) * n << "\n";
}
}
return 0;
}

