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

异或和之和

时间:2024-11-23 15:32:44浏览次数:5  
标签:奇数 int long 异或 result n1

//暴力做法 枚举每个子区间 O(n^3)
//优化1 利用前缀异或和快速求出区间异或和 O(n^2) 
//优化2 处理位运算的常用方法:拆位法  常用的思想:贡献法思想

下面详见优化2:

1.拆位贡献法 

 

 

2.实战真题1 

题目链接:1.异或和之和 - 蓝桥云课

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
	int n;
	cin>>n;
	vector<int>a(n);
	for(int i=0; i<n; i++)
	{
		cin>>a[i];
	}
	int result=0;
	for(int i=20; i>=0; i--) //遍历位数 
	{
		int s=0,n0=1,n1=0; //s表示前缀和,n0表示偶数个数(保证奇数本身占1),n1奇数个数 
		for(int j=0; j<n; j++)
		{
			int bit=(a[j]>>i)&1; //按位&,逐位判断0或1,计算贡献 
			s+=bit;  
			if(s%2) //奇数 
			{
				result+=(1<<i)*n0; //合法个数(2^n0)*合法区间 
				n1++;
			}
			else
			{
				result+=(1<<i)*n1;
				n0++;
			}
		}
	}
	cout<<result<<endl;
	return 0;
}

3.实战真题2 

初步掌握之和再练习一道题,题目链接: 19.区间异或的和 - 蓝桥云课

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=998244353;
signed main()
{
	int n;
	cin>>n;
	vector<int>a(n);
	for(int i=0; i<n; i++)
	{
		cin>>a[i];
	}
	int result=0;
	for(int i=30; i>=0; i--) //遍历位数 
	{
		int s=0,n0=1,n1=0; //s表示前缀和,n0表示偶数个数(保证奇数本身占1),n1奇数个数 
		for(int j=0; j<n; j++)
		{
			int bit=(a[j]>>i)&1; //按位&,逐位判断0或1,计算贡献 
			s+=bit;  
			if(s%2) //奇数 
			{
				result+=((1<<i)*n0)%mod; //合法个数(2^n0)*合法区间 
				n1++;
			}
			else
			{
				result+=((1<<i)*n1)%mod;
				n0++;
			}
		}
	}
	cout<<result<<endl;
	return 0;
}

标签:奇数,int,long,异或,result,n1
From: https://blog.csdn.net/2301_77869606/article/details/143894354

相关文章

  • 【题解】P3917 异或序列
    传送门也算是一个有关于异或的小trick吧,简单记录一下。可以维护原序列的前缀异或和\(sum\),于是原题答案贡献变为\(\sum\limits_{i=1}^n\sum\limits_{j=i}^nsum_j\oplussum_{i-1}\)。变形一下为\(\sum\limits_{i=0}^{n-1}\sum\limits_{j=1}^{i+1}sum_i\oplussum_{j}......
  • 使用异或操作实现字符串加密与解密
    异或加密是一种简单而有效的加密技术,它的特点是同一密钥可用于加密和解密,以下是一个例子:usingSystem;usingSystem.Text;publicstaticclassEncryption{///<summary>///bytes数据通过encryptCode进行异或(加密|解密)///将传入的bytes作为返回值,不再额外分......
  • [CL-22] 异或和之和
    CL-22二进制拆分。对于枚举到的每一个二进制位\(i\),注意到其对答案的贡献只有\(0\)和\(2^{i}\)两种情况考虑什么时候贡献是\(2^i\),可以发现,当选入奇数个该位为\(1\)的数之后,对答案的贡献是\(2^{i}\)因此变成求选出奇数个为\(1\)的数的方案数设该位为\(1\)的数有......
  • 关于异或哈希
    Re:疑惑异或哈希异或哈希是个很神奇的算法,利用了异或操作的特殊性和哈希降低冲突的原理,可以用于快速找到一个组合是否出现、序列中的数是否出现了\(k\)次算法如其名,异或+哈希。想起某首歌叫PPAP?Ihavea\(\oplus\),Ihavean\(hash\).(Uhh~)\(\oplushash\)!......
  • 异或线性基
    问题给定一个数组\(A=[a_1,a_2,...a_n]\),其中\(a_i≤2d\),在A中选择元素的某个子集,并将它们XOR。求你能得到的不同元素的个数。思路显然可以得到一个效率非常劣的做法x[0].insert(0);for(inti=1;i<=n;i++){x[i]=x[i-1];for(autocur:x[i-......
  • 异或线性基
    我们考虑这样一个问题:给定\(N\)个整数\(A_1,A_2,\dots,A_N\)。求能异或出多少种不同的值。我们考虑用一个集合\(S\)记录目前能凑出来的数字。当我们要加入\(A_i\)时,如果\(A_i\not\inS\),则\(x\oplusA_i(x\inS)\)一定都不在\(S\)中,否则可以通过\((x\oplusA_i)\o......
  • P4551 最长异或路径(树上前缀异或01-trie)
    #include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefvector<int>......
  • P10471 最大异或对 The XOR Largest Pair(01trie)
    #include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefvector<int>......
  • 信息学奥赛初赛天天练-88-CSP-S2023阅读程序1-数据类型、unsigned 关键字、二进制、位
    信息学奥赛初赛天天练-88-CSP-S2023阅读程序1-数据类型、unsigned关键字、二进制、位运算、左移、右移、异或运算PDF文档公众号回复关键字:202409132023CSP-S阅读程序1判断题正确填√,错误填⨉;除特殊说明外,判断题1.5分,选择题3分,共计40分)01#include<iostream>......
  • 异或的一些性质
    1.异或:相同为0不同为1\[0\oplusn=n\]\[n\oplusn=0\]2.异或定理\[4i\oplus(4i+1)\oplus(4i+2)\oplus(4i+3)=0\]证明:由于异或按位进行操作,将\(4i\)、\(4i+1\)、\(4i+2\)、\(4i+3\)二进制右移两位之后,得到\(4\)个偶数,其数值都为\(i\),因此,右移之后的异......