牛客小白月赛 103 C 题题解

题目链接

题目大意

给定一个正整数 n n n,求 mex ( { i ⊕ j ∣ i ∈ 1 , n , j ∈ 1 , n } ) \text{mex}(\lbrace i \oplus j \mid i \in 1, n, \ j \in 1, n \rbrace) mex({i⊕j∣i∈1,n, j∈1,n})。

其中 mex \text{mex} mex 表示集合中未出现的最小非负整数。

数据范围

  • 1 ≤ n ≤ 1 0 18 . 1 \leq n \leq 10^{18}. 1≤n≤1018.

Solution

要能异或出 1 1 1,最小的两个数都必须是 2 ⊕ 3 2 \oplus 3 2⊕3,所以 n ≤ 2 n \leq 2 n≤2 的 mex \text{mex} mex 都是 1 1 1.

下面讨论 n > 2 n > 2 n>2 的情况, 1 1 1 肯定能被表示出来。

取 m m m 满足 2 m − 1 < n ≤ 2 m 2^{m - 1} < n \leq 2^m 2m−1<n≤2m,用归纳法。初始时只有 [ 1 , 2 ) [1, 2) [1,2) 能被表示。

取 k = 1 k = 1 k=1,

  • 现在 [ 1 , 2 ) [1, 2) [1,2) 以内的数都可以被表示,
  • 将这些数都 ⊕ 2 \oplus 2 ⊕2, 会得到 [ 2 + 1 , 2 2 ) [2 + 1, 2^2) [2+1,22),
  • 再通过 ( 2 + 1 ) ⊕ 1 (2 + 1) \oplus 1 (2+1)⊕1 得到 2 2 2,这样就扩展到 [ 1 , 2 2 ) [1, 2^2) [1,22).
suppose \\text{suppose} suppose: 下面的 i \< m i \< m i\

设 k = i − 1 k = i - 1 k=i−1 时能扩展到 [ 1 , 2 i ) [1, 2^i) [1,2i)。

那么 k = i k = i k=i 时,

  • 现在 [ 1 , 2 i ) [1, 2^i) [1,2i) 以内的数都可以被表示,
  • 将这些数都 ⊕ 2 i \oplus 2^i ⊕2i, 会得到 [ 2 i + 1 , 2 i + 1 ) [2^i + 1, 2^{i + 1}) [2i+1,2i+1),
  • 再通过 ( 2 i + 1 ) ⊕ 1 (2^i + 1) \oplus 1 (2i+1)⊕1 得到 2 i 2^i 2i,这样就扩展到 [ 1 , 2 i + 1 ) [1, 2^{i + 1}) [1,2i+1).

所以我们得到, k = m − 1 k = m - 1 k=m−1 时,可以扩展到 [ 1 , 2 m ) [1, 2^m) [1,2m)。

如果再取 k = m k = m k=m,分类讨论:

  • n < 2 m n < 2^m n<2m, 我们无法进行第二步: 【将这些数都 ⊕ 2 m \oplus 2^m ⊕2m】,
  • n = 2 m n = 2^m n=2m,我们可以进行第二步,得到 [ 2 m + 1 , 2 m + 1 ) [2^m + 1, 2^{m + 1}) [2m+1,2m+1),
    • 但是无法进行第三步: 【再通过 ( 2 m + 1 ) ⊕ 1 (2^m + 1) \oplus 1 (2m+1)⊕1 得到 2 m 2^m 2m】.

综上,取 m m m 满足 2 m − 1 < n ≤ 2 m 2^{m - 1} < n \leq 2^m 2m−1<n≤2m, mex = 2 m \text{mex} = 2^m mex=2m。

时间复杂度 O ( log ⁡ n ) O(\log n) O(logn)

Code

cpp 复制代码
#include <bits/stdc++.h>

using i64 = long long;

void solve() {
    i64 n;
    std::cin >> n;
    
    if (n <= 2) {
        std::cout << 1 << "\n";
    } else {
        int k = std::__lg(2 * n - 1);
        std::cout << (1LL << k) << "\n";   
    }
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int T;
    std::cin >> T;
    
    while (T--) {
        solve();
    }
    
    return 0;
}
相关推荐
yszaygr21387 小时前
Verilog参数化游程编码RLE模块
算法
望易8 小时前
刚设计的大模型架构-双域耦合认知框架
算法·架构
复杂网络11 小时前
多个 Claude Code 与多个 Codex 协同工作:设计与实现方案
算法
apocelipes1 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
HjhIron1 天前
面试常客:字符串算法从入门到进阶
算法·面试
吴佳浩1 天前
DeepSeek DSpark:Confidence-Scheduled Speculative Decoding 技术解析
人工智能·算法·deepseek
触底反弹1 天前
🧠 搞懂 Token,才算真正入门大模型——从分词原理到 Embedding 语义实战
javascript·人工智能·算法
vivo互联网技术1 天前
ICLR 2026 | 基于后验采样的图像恢复方法LearnIR:人脸去阴影、去雾
人工智能·算法·aigc
浮生望1 天前
JS字符串与回文算法:从包装类到双指针的面试进阶之路
javascript·算法
黄敬峰1 天前
面试必刷:从JS底层包装类到双指针,彻底搞懂字符串与回文算法
算法