题解 | #比赛安排(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;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务