牛客小白月赛 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;
}
相关推荐
进化中的刀盾兽6 分钟前
从零实现 C++ Json-Rpc(九):从 TCP 字节流中拆出完整消息——MuduoBuffer 与 LVProtocol
c++·rpc
Laurie三省14 分钟前
现场版却配上录音室版的歌词?聊聊我给开源 Mac 歌词软件写的多源打分算法
算法·macos·go
对空六课24 分钟前
Vue 组件曝光埋点为什么会重复触发?去重方案与实现思路
服务器·前端·算法·数据分析
HZY1618yzh31 分钟前
下一代编程语言出炉
c++·算法
CoderYanger38 分钟前
A.每日一题:856. 括号的分数
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
wyhwust1 小时前
No1-绪论
c++
kiracrimson1 小时前
选择排序与快速排序:一次选极值,一次分区间
算法·排序算法
无名猿1 小时前
C++ 对象内存模型:vtable 布局、多继承 vptr、RTTI 与 dynamic_cast 走查
c++·内存管理·调试技巧·现代c++
All for pursuit.1 小时前
【动态规划-8】152.乘积最大子数组
数据结构·c++·算法·leetcode·动态规划
信奥卷王1 小时前
[GESP202512 六级] 路径覆盖
数据结构·算法