牛客小白月赛 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;
}
相关推荐
大明者省5 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
白狐_7987 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2587 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
ShineWinsu7 小时前
对于C++:C++11中lambda、function、bind的解析
c++·面试·笔试·开发·lambda·bind·function
码匠许师傅7 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
Shell运维手记7 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI8 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型8 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光8 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
汉字萌萌哒8 小时前
2024CSP-J入门级C++真题详解
开发语言·c++