当前位置: 首页 > 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.jsqmd.com/news/22130/

相关文章:

  • 深入解析:Java外功精要(2)——Spring IoCDI
  • 2025年矩形橡胶支座源头厂家权威推荐榜单:GJZ矩形橡胶支座/圆形橡胶桥梁支座/桥梁橡胶支座源头厂家精选
  • 2025年永磁同步变频器加工厂权威推荐榜单:高压变频柜装置/通用矢量变频器/高压变频器源头厂家精选
  • 首批CCF教学案例大赛资源上线:涵盖控制仿真、算法与机器人等9大方向 - 教程
  • HT-PBR-0006SMG:20W 连续、3 相位失衡,一颗贴片省掉整块匹配网络
  • 2025年人字纹机织布源头厂家权威推荐榜单:700g机织布/锦纶工业用布/800g机织布源头厂家精选
  • 双模更超模!飞利浦双模办公娱乐显示器27E2N5900RW优雅登场! - 实践
  • Day4无序,有序和定义列表
  • 技术管理
  • 威胁狩猎平台升级:全新认证机制与功能增强
  • SpringMVC 启动与请求处理流程解析 - Higurashi
  • 精读C++20设计模式——结构型设计模式:享元模式 - 实践
  • Java 企业 AI 转型选什么?JBoltAI 框架:20 + 大模型 + 向量数据库,AI 应用超灵活
  • 20232401 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 2025 年破胶机厂家最新推荐排行榜:聚焦 610/710/810 型及大型自动低温环保设备,精选优质企业
  • 实用指南:音视频学习(六十七):音视频像素格式
  • 2025 年度深海网箱优质厂家最新推荐排行榜:大型 / 抗风浪 / 全潜式 / 重力式 / 休闲式 / 圆形 / PE/HDPE/ 挪威式网箱领军企业权威测评发布
  • 学习日报 20250928|Java日志规范:从基础规约到高级实践(含SkyWalking整合) - 实践
  • Log4Net配置文件参考
  • 2025年8座旅游观光车供应商权威推荐榜单:11座旅游观光车/景区观光车/燃油观光车源头厂家精选
  • 2025年服装厂家推荐排行榜,棒球帽,卫衣,羽绒服,春秋季运动休闲服饰厂家精选
  • 2025年铁氟龙高温线厂家权威推荐榜:极细铁氟龙/UL10064铁氟龙/UL1332铁氟龙/UL1867铁氟龙/UL10064极细铁氟龙/UL1332极细铁氟龙/UL1867极细铁氟龙专业解析
  • 2025年卫衣品牌权威推荐榜:精选纯棉/加绒/oversize/情侣款卫衣源头厂家,潮流与舒适兼备的穿搭首选
  • 2025年透声膜厂家权威推荐榜:防水透声膜,透气透声膜,手表/耳机/智能手环专用透声膜优质供应商精选
  • 2025年红木家具厂家权威推荐榜:交趾黄檀/小叶紫檀/巴里黄檀/缅甸花梨/阔叶黄檀,明清古典榫卯工艺高端定制全屋整装,源头工厂精选
  • 2025年红木家具厂家权威推荐榜:交趾黄檀/小叶紫檀/巴里黄檀/缅甸花梨/阔叶黄檀,明清古典榫卯工艺高端定制全屋整装,白胚烘干源头工厂精选
  • 2025年实木家具厂家权威推荐榜:原木/全实木/北美黑胡桃/樱桃木/榫卯工艺高端定制,实木全屋整装,烘干/白胚/木蜡油保养,经典款品质之选
  • 2025年除尘设备厂家权威推荐榜:脉冲除尘器、中央脉冲除尘器、工业除尘器源头企业综合实力解析
  • 2025年高压加速老化设备厂家推荐排行榜:HAST高压加速老化、PCT高压加速老化、热流仪源头厂家专业测评与选购指南
  • 2025年环境试验设备厂家权威推荐榜:冷热冲击/高低温/氙灯耐候/步入式恒温恒湿/HAST老化/机械淋雨试验箱全方位解析