专栏文章
题解:P12177 [蓝桥杯 2025 省 Python B] 异或和
P12177题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mip8e95n
- 此快照首次捕获于
- 2025/12/03 07:50 3 个月前
- 此快照最后确认于
- 2025/12/03 07:50 3 个月前
二进制拆位 + 贡献计算 + 快写输出 int128
原式:
等价于:
为了更贴合我们的习惯,我们调换一下 和 的大小关系:
不难发现可以使用贡献计算的方式解决。
用 记录枚举到的前 个数的二进制表示下第 位为 的个数。
再用 记录枚举到的前 个数的二进制表示下第 位为 的下标总和。
设当前枚举到的第 个数的二进制表示下第 位为 。
那么问题就转化为:
由于 可以达到 规模,任意的 数对可以达到 规模,而 又可以达到 规模。共 规模,所以可能爆 long long,需要开
CPP__int128。#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
typedef long long LL;
const int N=1e5+5;
LL n;
LL a[N];
LL cnt[22][2],sum[22][2];
inline void write(__int128 x){
if(x>9) write(x/10);
putchar(x%10+'0');
}
void solve(){
cin>>n;
rep(i,1,n) cin>>a[i];
__int128 ans=0;
per(k,20,0){
rep(i,1,n){
int bit=(a[i]>>k)&1;
ans+=(1LL<<k)*(cnt[k][bit^1]*i-sum[k][bit^1]);
cnt[k][bit]++,sum[k][bit]+=i;
}
}
write(ans);
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...