5373. 中等计算

文章目录

Question

给定一个长度为 n

的非负整数序列 a1,a2,...,an

对于 1≤i≤n

,有 bi=ai⊕(imod1)⊕(imod2)⊕...⊕(imodn)

请你计算并输出 b1⊕b2⊕...⊕bn

的值。

表示按位异或。

输入格式

第一行包含整数 n

第二行包含 n

个整数 a1,a2,...,an

输出格式

一个整数,表示 b1⊕b2⊕...⊕bn

的值。

数据范围

前 3

个测试点满足 1≤n≤3

所有测试点满足 1≤n≤106

,0≤ai≤2×109

输入样例:

3

1 2 3

输出样例:

3

Ideas

Code

cpp 复制代码
// 时间复杂度需要控制在O(N)或者O(nlgn)
// 将计算结果的矩阵写出来,尝试找规律,发现竖着有规律
// 规律为,第一列取模结果均为0000,第二列为0101,第三列为0120...以此循环
// 根据异或运算的性质(交换律、X^X=0)可以得出如果循环序列循环k次,k为偶数就等于0
// 所以只需要判断k是否奇数,还需要处理循环序列的最后的部分,最后一个元素为n%i(i为列号)
// 可以预处理一个前缀和数组s[i],表示1^2...^n; s[0] = 0
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1000010;

int n;
int s[N];

int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++ ) s[i] = s[i - 1] ^ i;

    int res = 0;
    for (int i = 0; i < n; i ++ )
    {
        int a;
        scanf("%d", &a);
        res ^= a;
    }

    for (int i = 1; i <= n; i ++ )
    {
        int k = n / i; 
        if (k & 1) res ^= s[i - 1];
        res ^= s[n % i];
    }

    printf("%d\n", res);
    return 0;
}
相关推荐
库克克21 分钟前
【C++】C++11 包装器function 与 绑定器 bind
开发语言·c++
小小龙学IT32 分钟前
C++ Placement New 与显式析构:手动对象生命周期管理的艺术
c++·windows·mfc
Gauss松鼠会42 分钟前
【GaussDB】GaussDB锁阻塞源头查询
java·开发语言·前端·数据库·算法·gaussdb·经验总结
oier_Asad.Chen44 分钟前
【洛谷题解/AcWing题解】洛谷P4011 孤岛营救问题/AcWing1131拯救大兵瑞恩
数据结构·笔记·学习·算法·动态规划·图论·宽度优先
小保CPP1 小时前
OpenCV C++车型识别2-形状匹配
c++·人工智能·opencv·计算机视觉
冻柠檬飞冰走茶1 小时前
PTA基础编程题目集 7-19 支票面额(C语言实现)
c语言·开发语言·数据结构·算法
船漏了就会沉2 小时前
状态压缩DP:小数据下的“暴力美学”
算法
你怎么知道我是队长2 小时前
计算机虚拟存储管理与页面置换算法详解
服务器·网络·算法
罗西的思考2 小时前
【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 — (14)— Teacher
人工智能·笔记·深度学习·算法·机器学习
塔能物联运维2 小时前
塔能两相液冷:600W/cm²极限能力,为下一代AI芯片预留充足散热余量
人工智能·算法·两相液冷