5373. 中等计算
2023-12-17 23:39:06
    		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
// 时间复杂度需要控制在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;
}
    			文章来源:https://blog.csdn.net/qq_49821869/article/details/135052052
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
    	本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!