异或差分序列_【洛谷P3917】异或序列

博客介绍了如何解决一道关于异或差分序列的问题,提供了两种解法。解法1通过预处理序列的前缀异或和,统计不同位上为1的个数,利用组合计数原理计算答案。解法2则将问题分解为多个子问题,逐位计算异或值的贡献。最终输出两种方法的代码实现。
摘要由CSDN通过智能技术生成

题目大意:给定一个长度为 N 的序列,每个位置有一个权值,求 $$\sum\limits_{1\le i\le j\le n}(a_i\oplus a_{i+1}...\oplus a_j)$$ 的值。

题解:

解法1:从整体考虑。

先预处理出序列的前缀异或和。根据和式的性质可知,对于任意两个点 i,j 的组合均会计入答案贡献,而异或值为 1 才会对答案产生贡献。因此,统计出对于32位中的每一位来说,前缀和序列中该位为 1 的个数。最后根据组合计数原理,每一位对答案的贡献为该位 1 的个数乘以该位 0 的个数乘以对应的 2 的幂即可。

代码如下

#include

#define fi first

#define se second

#define pb push_back

#define mp make_pair

#define all(x) x.begin(),x.end()

#define cls(a,b) memset(a,b,sizeof(a))

using namespace std;

typedef long long ll;

typedef pair P;

const int dx[]={0,1,0,-1};

const int dy[]={1,0,-1,0};

const int mod=1e9+7;

const int inf=0x3f3f3f3f;

const int maxn=1e5+10;

const double eps=1e-6;

inline ll gcd(ll a,ll b){retu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值