蓝桥杯备赛:Day8-小苯的异或和

📚 算法笔记:小苯的异或和 (贡献法与位运算性质)

1. 题目简述

M-小苯的异或疑惑(hard)_北京信息科技大学第十五届程序设计竞赛(同步赛)

  • 场景 :给定长度为 n n n 的数组 a a a,计算所有满足 1 ≤ i < j ≤ n 1 \le i < j \le n 1≤i<j≤n 的 ( a i ⊕ a j ) (a_i \oplus a_j) (ai⊕aj) 的总异或和。
  • 核心挑战 : n n n 高达 2 × 10 5 2 \times 10^5 2×105,两两组合共有 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n−1) 对,暴力计算会达到 2 × 10 10 2 \times 10^{10} 2×1010 次运算,必然超时。
  • 目标 :在 O ( n ) O(n) O(n) 或 O ( n log ⁡ n ) O(n \log n) O(nlogn) 时间内求出结果。

2. 核心代码 (C++ 实现)

c++ 复制代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

void solve()
{
    int n;
    if(!(cin >> n)) return;
    
    vector<int> a(n);
    int total_xor = 0;
    for(int i = 0; i < n; i++)
    {
        cin >> a[i];
        total_xor ^= a[i]; // 预先计算所有元素的异或总和
    }
    
    // 关键逻辑判断:
    // 每个数 a[i] 会出现在 (n-1) 个组合中。
    // 如果 (n-1) 是偶数,a[i] 异或偶数次抵消为 0。
    // 如果 (n-1) 是奇数,a[i] 异或奇数次等价于异或 1 次。
    if ((n - 1) % 2 == 0)
    {
        cout << 0 << endl;
    }
    else
    {
        cout << total_xor << endl;
    }
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    
    int _ = 1;
    while(_--)
    {
        solve();
    }
    return 0;
}

3. 核心考点与注意事项

  • 贡献法 (Contribution Technique):不计算每对组合的结果,而是统计每个元素在最终算式中出现了多少次。
  • 异或的归零性 :异或运算最核心的性质是 x ⊕ x = 0 x \oplus x = 0 x⊕x=0。只要某个数出现了偶数次,它在异或链中就会彻底消失。
  • 组合数学计数
    • 元素 a k a_k ak 会和它前面的 k − 1 k-1 k−1 个数配对,也会和它后面的 n − k n-k n−k 个数配对。
    • 总次数 = ( k − 1 ) + ( n − k ) = n − 1 = (k-1) + (n-k) = n-1 =(k−1)+(n−k)=n−1 次。
    • 这是一个常数,意味着所有数字出现的次数是一样多的。

🛠️ 位运算基础备忘录

符号 操作 关键特性
^ 异或 相同为 0,不同为 1;自反性 a ⊕ b ⊕ b = a a \oplus b \oplus b = a a⊕b⊕b=a
& 按位与 全 1 为 1;常用于取位或判断奇偶 x & 1
` ` 按位或
<< 左移 x ≪ n x \ll n x≪n 相当于 x ⋅ 2 n x \cdot 2^n x⋅2n
相关推荐
王老师青少年编程2 小时前
csp信奥赛c++中的递归和递推研究
c++·算法·递归·递推·csp·信奥赛
样例过了就是过了2 小时前
LeetCode热题100 跳跃游戏
c++·算法·leetcode·贪心算法·动态规划
chen_ever2 小时前
从网络基础到吃透 Linux 高并发 I/O 核心(epoll+零拷贝 完整版)
linux·网络·c++·后端
无限进步_3 小时前
【C++&string】寻找字符串中第一个唯一字符:两种经典解法详解
开发语言·c++·git·算法·github·哈希算法·visual studio
小此方3 小时前
Re:思考·重建·记录 现代C++ C++11篇 (二) 右值引用与移动语义&引用折叠与完美转发
开发语言·c++·c++11·现代c++
深邃-3 小时前
【C语言】-数据在内存中的存储(1)
c语言·开发语言·数据结构·c++·算法
xiaoye-duck3 小时前
《算法题讲解指南:优选算法-字符串》--61.最长公共前缀,62.最长回文子串,63.二进制求和,64.字符串相乘
c++·算法·字符串
chh5633 小时前
从零开始学C++--类和对象
java·开发语言·c++·学习·算法
xyx-3v3 小时前
C++构造函数、析构函数与拷贝控制深度解析
开发语言·c++