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;
}
相关推荐
hnjzsyjyj1 分钟前
洛谷 P1339:[USACO09OCT] Heat Wave G ← Bellman-Ford 算法
数据结构·bellman-ford 算法
起个名字费劲死了12 分钟前
VisionMaster集成深度学习算法(基础狗)
人工智能·深度学习·算法
lengxuenong16 分钟前
枚举例题分析
c++·算法·青少年编程
繁华的地方不一定留下你的脚印28 分钟前
C++线程如何安全停止与唤醒:std::jthread、stop_token与condition_variable
开发语言·c++
Navigator_Z34 分钟前
LeetCode //C - 1269. Number of Ways to Stay in the Same Place After Some Steps
c语言·算法·leetcode
2601_9657422237 分钟前
短视频脚本创作方法分享:本地生活类账号的起步思路
大数据·人工智能·算法·ai·新媒体运营·生活
55873生态系统手记1 小时前
读完 55873 资产钱包的技术栈,我重新理解了 "合规钱包" 应该长什么样
算法·架构
旋生万物1 小时前
素数螺旋映射 $z_n=n^{1+i}$ 的角分布统计检验与零模型对比
大数据·前端·人工智能·算法·云原生·螺旋生成论·螺旋相位
HRTOS1 小时前
HRTOS Shell继续完善:优化printf缓冲区与字符串越界保护,国庆后随新版本更新
运维·单片机·嵌入式硬件·算法·51单片机
沫璃染墨1 小时前
《从零入门Linux系统篇(五十一):线程篇·四——pthread线程库详解:从线程创建到终止与分离》
linux·运维·服务器·开发语言·c++·系统架构·线程