首页 > 其他分享 >异或和之和

异或和之和

时间:2024-02-17 21:55:20浏览次数:23  
标签:int pow ll ++ 异或 sum

引言

题目链接:https://www.luogu.com.cn/problem/P9236

思路

首先暴力的做法是求出其前缀异或数组 sum, 之后将其两两异或,结果相加,其时间复杂度为 O(n^2)

假设所有 sum 的二进制的第 i 位为 a 个 1 和 b 个 0,那么根据异或的性质,1 和 1,0 和 0 的异或结果为 0,不影响结果。

那么对结果有影响的应该是该位为 0 和该位为 1 的 sum 异或,此时对答案的贡献为 \(2^i\)。

所以该题只需要统计所有 sum 每一位的 0 和 1 的个数 a 和 b,该位对答案的贡献即为 \(2^i * (a * b)\)

代码

#include <bits/stdc++.h>
#define ll long long
#define N 100010

ll a[N],sum[N],w[30][2];

int main() {
	int n;
	std::cin >> n;
	for (int i = 1 ; i <= n ; i ++ ) std::cin >> a[i];

	for (int i = 1 ; i <= n ; i ++ ) sum[i] = sum[i - 1] ^ a[i];

	for (int i = 0 ; i <= n ; i ++ ) {
		for (int j = 0 ; j < 30 ; j ++ ) {
			if(sum[i] >> j & 1) w[j][1] ++ ;
			else w[j][0] ++ ;
		}
	}

	ll ans = 0, pow = 1;
	for (int i = 0 ; i < 30 ; i ++ ) {
		ans += pow * (w[i][0] * w[i][1]);
		pow *= 2;
	}

	std::cout << ans << '\n';

	return 0;
}

标签:int,pow,ll,++,异或,sum
From: https://www.cnblogs.com/NachoNeko/p/18018501

相关文章

  • 异或和之和
    数论典题,拆成二进制位进行分析,首先用计算异或前缀和,便于区间操作,对于区间[L,R],其区间异或值为$Xor[L-1]⊕Xor[R]$,统计区间的在第$i$位为$1$的个数,那么根据乘法原理,有$cnt$个$1$和剩余的$0$组合,然后这个是算出了有多少种方案让当前这一位有贡献,要算出答案需要对cnt[i]......
  • Codeforces Round 770 (Div. 2)(数学异或奇偶性)
    B.FortuneTelling拿到题目看数据范围之后就知道暴力显然是来不及的。那么只能找性质。\(考虑x和x+3的不同\quad奇偶性不同\)\(然后考虑两种操作对于一个数的奇偶性的影响\)\(加法:同奇偶则运算结果是偶,不同则运算结果为奇\)\(异或:惊奇的发现异或也是这样的\)这样我们就......
  • C# 对数值进行与,或,异或操作的学习理解
    //&符号是and,与,一个为0都是0,全部为1才是1//1&1=1,1&0=0,1与任何数都是任何数//0&1=0,0&0=0,0与任何数都是0varnum1=0b_1010_1010_1010;varnum2=0b_1111_0000;//保留num1二进制中4-7位Conso......
  • 异或运算的性质
    异或是一种基于二进制的位运算,用符号XOR或者^表示。性质1、交换律2、结合律:即(a^b)^c==a^(b^c))3、对于任何数x,都有x^x=0,x^0=x,x^1=x'。即一位数(假设是a),与自身异或,一定等于0; 与0异或-->等于本身;  与1异或---->等于a'。4、自反性A^B^B=A^0=A异或运算最常见于多项......
  • CF-1831-E-卡特兰数+异或哈希+差分
    1831-E题目大意给定一个整数\(n\),和\(k\)个区间,区间端点范围在\([1,n]\)内。如果有一个长为\(n\)合法的括号序列,且它的这\(k\)个区间\([l,r]\)中的子括号序列也是合法的,那么称这个括号序列是“好的”。请你求出有多少个长度为\(n\)的“好的”括号序列,答案对\(998244353\)取模......
  • 洛谷 P9745 「KDOI-06-S」树上异或 题解
    Solution树形DP好题。PartI部分分类比下文为简单,我们称一个连通块的权值为连通块内点的异或和。考虑链的部分分,显然可以设\(f_{i}\)是前\(i\)个点所有断边方案的权值和,对于每个点枚举上一条断的边转移。令\(s_i=\bigoplus_{j=1}^{i}a_j\),则\(f_i=\sum_{j=0}^{i-1}(s......
  • 最大异或和 可持久化数据结构入门
    最大异或和题目描述给定一个非负整数序列\(\{a\}\),初始长度为\(N\)。有\(M\)个操作,有以下两种操作类型:Ax:添加操作,表示在序列末尾添加一个数\(x\),序列的长度\(N\)加\(1\)。Qlrx:询问操作,你需要找到一个位置\(p\),满足\(l\lep\ler\),使得:\(a[p]\oplusa[p+1]......
  • 刷题 位运算异或 异或前缀和
    2024.1.18杭州电子科技大学2023华为杯编程竞赛 解题思路首先可以知道,我们任意选一点为根root往下递归异或就可以得到f[i](root到i的路径异或值),那么 l到r的路劲异或值可以由f[l]^f[r]得出那么如何计算答案呢,就是用f[l]~f[r]分别异或f[x]......
  • abc098d<双指针,异或>
    题目D-XorSum2给出n个元素的数组a,求满足条件的子区间个数:数组a子区间元素和与异或和相等。思路和与异或和相同,即没有任何进位,也就是区间中对于范围内每个二进制位,最多出现一次;使用双指针,统计每个二进制位最多出现一次的区间个数即可;总结异或:不进位加法;代码点击......
  • 异或交换两个数
    先来复习一下&,|,^,~这四个位运算符号吧!(与)&:0&0=01&0=00&1=01&1=1(或)|:0|0=01|0=10|1=11|1=1(异或)^:0^0=01^0=10^1=11^1=0(取反)~:~1=0~0=1分析:8的二进制是1000,7的二进制是01118^7=1000^0111=1111=1515^7=1111^0111=1000=8可以看到,一个数异或两次就是它......