当前位置: 首页 > news >正文

序列异或求贡献

序列异或求贡献是一类常见的题目,经典做法无非是求前后缀,按进制位拆贡献累计答案,但是需要对具体问题具体分析。

异或和之和

设前缀异或和为 \(sum_i\)\(sum_0\)=0),对 \(sum_i\) 二进制拆位。\(tot1_k\) 为二进制拆位第 \(k\) 位为 \(1\) 的数的个数,\(tot0_k\) 为二进制拆位第 \(k\) 位为 \(0\) 的数的个数。推式子:

\[\sum_{L=1}^{n}\sum_{R=L}^n\bigoplus_{i=L}^Ra_i \]

\[=\sum_{L=1}^{n}\sum_{R=L}^nsum_R-sum_{L-1} \]

\[=\sum_{L=1}^{n}\sum_{R=L}^nsum_R-sum_{L-1} \]

\[=\sum_{k=0}^{20}tot1_k\times tot0_k\times 2^k \]

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,ans(0);
int a[N];
signed main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;a[0]=0;for(int i=1;i<=n;++i) cin>>a[i],a[i]^=a[i-1];for(int k=0;k<21;++k){int tot[2]={0,0};for(int i=0;i<=n;++i){ans+=tot[!(a[i]>>k&1)]*(1<<k);//边扫边统计和最后算乘积是一样的tot[1]+=a[i]>>k&1;tot[0]+=!(a[i]>>k&1);}}cout<<ans<<endl;return 0;
}

异或平方和

据说是 \(ACM\) 省赛金牌题......真的假的

\(a_i\) 二进制拆位:

\(tot10_{m,k}\) 为二进制拆位第 \(m\) 位为 \(1\)\(k\) 位为 \(0\)\(a_i\) 的个数。

\(tot01_{m,k}\) 为二进制拆位第 \(m\) 位为 \(0\)\(k\) 位为 \(1\)\(a_i\) 的个数。

\(tot11_{m,k}\) 为二进制拆位第 \(m\) 位为 \(1\)\(k\) 位为 \(1\)\(a_i\) 的个数。

\(tot00_{m,k}\) 为二进制拆位第 \(m\) 位为 \(0\)\(k\) 位为 \(0\)\(a_i\) 的个数。

\(tot0_{m}\) 为二进制拆位第 \(m\) 位为 \(0\)\(a_i\) 的个数。

\(tot1_{m}\) 为二进制拆位第 \(m\) 位为 \(1\)\(a_i\) 的个数(实际上这个不就是 \(n-tot0_m\) 嘛)。

推式子:

\[\begin{aligned} &\sum_{i=1}^{n}\sum_{j=1}^n(a_i\oplus a_j)^2\\=&\left(\sum_{m=0}^{31}\sum_{k=0}^{31}tot01_{m,k}\times tot10_{m,k}\times 2^{k+1}\right)+\\ &\left(\sum_{m=0}^{31}\sum_{k=0}^{31}tot00_{m,k}\times tot11_{m,k}\times 2^{k+1}\right)+\\ &\left(\sum_{m=0}^{31}\times tot1_{m}\times tot0_{m}\times 2^{2k}\right)\\ \end{aligned} \]

当然你也可以边扫边统计贡献,一样的。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10,p=1e9+7;
int n,ans(0);
int a[N],fac[N];
int c[100],c01[50][50],c10[50][50],c11[50][50],c00[50][50];
signed main(){// freopen("data","r",stdin);// freopen("my.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;for(int i=1;i<=n;++i) cin>>a[i];fac[0]=1;for(int i=1;i<=50;++i) fac[i]=fac[i-1]*2%p;for(int k=0;k<32;++k){for(int i=1;i<=n;++i){c[k]+=a[i]>>k&1;}for(int m=k+1;m<32;++m){for(int i=1;i<=n;++i){c01[k][m]+=!(a[i]>>k&1)&&(a[i]>>m&1);c10[k][m]+=(a[i]>>k&1)&&!(a[i]>>m&1);c11[k][m]+=(a[i]>>k&1)&&(a[i]>>m&1);c00[k][m]+=!(a[i]>>k&1)&&!(a[i]>>m&1);}}}for(int k=0;k<32;++k){for(int m=k+1;m<32;++m){ans=(ans+c01[k][m]*c10[k][m]%p*fac[1+m+k])%p;ans=(ans+c00[k][m]*c11[k][m]%p*fac[1+m+k])%p;}ans=(ans+c[k]*(n-c[k])*fac[k<<1]%p);}cout<<(ans*2)%p<<endl;return 0;
}

异或和

稍微有点不一样,转换一下思路,但是总体肯定还是“前缀和+拆位算贡献”的思想。

\[\bigoplus\sum_{L=1}^{n}\sum_{R=L}^n\sum_{i=L}^Ra_i \]

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,ans(0),gs(0);
int a[N],fac[N],tem[N];
int num[N][35],res[35];
struct BIT{#define lowbit(x) (x&(-x))int t[N];void add(int pos,int v){if(!pos) t[pos++]+=v;for(int i=pos;i<=N-10;i+=lowbit(i)) t[i]+=v;}int sum(int pos){if(!pos) return t[0];int res(0);for(int i=pos;i;i-=lowbit(i)) res+=t[i];return res;}
}t[35][2];
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;for(int i=1;i<=n;++i){cin>>a[i];fac[i]=fac[i-1]+a[i];for(int k=0;k<32;++k) num[i][k]=fac[i]&((1<<k+1)-1);}for(int k=0;k<32;++k){for(int i=0;i<=n;++i) tem[i]=num[i][k];sort(tem,tem+n+1);gs=unique(tem,tem+n+1)-tem;for(int i=0;i<=n;++i)num[i][k]=lower_bound(tem,tem+gs,num[i][k])-tem;}for(int k=0;k<32;++k){for(int i=0;i<=n;++i){int f1=t[k][1].sum(num[i][k-1]),f0=t[k][0].sum(num[i][k-1]);int siz1=t[k][1].sum(N-10),siz0=t[k][0].sum(N-10);res[k]+=fac[i]>>k&1?f0+siz1-f1:siz0-f0+f1;t[k][(fac[i]>>k)&1].add(num[i][k-1],1);}}for(int k=0;k<32;++k) ans+=(res[k]&1)*(1<<k);cout<<ans<<endl;
}

Sum of XOR Functions

http://www.zskr.cn/news/30228.html

相关文章:

  • 2025年永磁同步变频器加工厂权威推荐榜单:高压变频柜装置/通用矢量变频器/高压变频器源头厂家精选
  • 首批CCF教学案例大赛资源上线:涵盖控制仿真、算法与机器人等9大方向 - 教程
  • Day4无序,有序和定义列表
  • 刷题日记—数组练习-幻方
  • Java 企业 AI 转型选什么?JBoltAI 框架:20 + 大模型 + 向量数据库,AI 应用超灵活
  • 20232401 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 2025 年破胶机厂家最新推荐排行榜:聚焦 610/710/810 型及大型自动低温环保设备,精选优质企业
  • Log4Net配置文件参考
  • 2025年8座旅游观光车供应商权威推荐榜单:11座旅游观光车/景区观光车/燃油观光车源头厂家精选
  • 2025年服装厂家推荐排行榜,棒球帽,卫衣,羽绒服,春秋季运动休闲服饰厂家精选
  • 2025年除尘设备厂家权威推荐榜:脉冲除尘器、中央脉冲除尘器、工业除尘器源头企业综合实力解析
  • 2025年高压加速老化设备厂家推荐排行榜:HAST高压加速老化、PCT高压加速老化、热流仪源头厂家专业测评与选购指南
  • 2025年小型收卷机生产商权威推荐榜单:收卷机械设备/多功能收卷机/收卷机械源头厂家精选
  • 完整教程:Redis 的 KEYS 命令不能乱用啊
  • 以前叫冤种,现在叫家人。
  • 开源 C# 迅速创建(十一)线程
  • 详细介绍:云栖2025 | 阿里云AI搜索年度发布:开启Agent时代,重构搜索新范式
  • 2025 年最新推荐!吐司面包包装机厂家权威榜发布,含中国烘焙设备协会测评数据与优质企业精选食品装袋封口/面包装袋封口/吐司套袋封口包装机优质厂家提推荐
  • 十月读书笔记_2
  • Yolo11Onnx——图像前处理
  • 基于Langgraph+Langchain框架实现的旅行规划助手
  • 实用指南:【AI入门课程】2、AI 的载体 —— 智能硬件
  • QEMU 实现新指令
  • Python matplotlib 画图入门示例01
  • 一文读懂x402 协议
  • 2025年摩托车厂家权威推荐榜:覆盖街车、跑车、巡航车、越野车的最新选购指南及品牌实力解析
  • 2025年摩托车/机车厂家权威推荐榜:专业制造工艺与卓越性能口碑之选,覆盖街车、跑车、巡航车型的源头厂家深度解析
  • 2025年英语学习机推荐:市场报告级评测榜单新鲜出炉
  • 2025年英语学习机推荐:主流品牌对比排行榜与避坑指南
  • 2025年暖风机口碑排行榜:五款主流机型对比与避坑指南