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

异或和之和

时间:2024-02-02 17:33:35浏览次数:22  
标签:cnt Xor int long 异或 区间

数论典题,拆成二进制位进行分析,首先用计算异或前缀和,便于区间操作,对于区间[L,R],其区间异或值为 $Xor[L-1]⊕Xor[R]$,统计区间的在第 $i$ 位为$1$的个数,那么根据乘法原理,有$cnt$个$1$和剩余的$0$组合,然后这个是算出了有多少种方案让当前这一位有贡献,要算出答案需要对cnt[i] (n - cnt[i])乘以1 << k - 1(k表示枚举的是二进制下的第几位)

以下介绍两种做法:

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=2e6+10;
int n,s[N],res;
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        int x; cin>>x;
        s[i]=s[i-1]^x;
    }
    for(int i=0;i<=30;i++){
        int cnt=0;
        for(int j=1;j<=n;j++)
            if((1<<i)&s[j]) cnt++;
        res+=(1<<i)*(n-cnt+1)*cnt;
    }
    cout<<res;
}
#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=2e6+10;
int n,s[N],cnt1[N],cnt2[N],res;
signed main(){
    cin>>n;
    for(int i=0;i<=30;i++) cnt2[i]=1;
    for(int i=1;i<=n;i++){
        int x; cin>>x;
        s[i]=s[i-1]^x;
        for(int j=30;j>=0;j--){
            if((1<<j)&s[i]) res+=(1<<j)*cnt2[j],cnt1[j]++;
            else res+=(1<<j)*cnt1[j],cnt2[j]++;
        }
    }
    cout<<res;
}

 

标签:cnt,Xor,int,long,异或,区间
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/18003562

相关文章

  • Codeforces Round 770 (Div. 2)(数学异或奇偶性)
    B.FortuneTelling拿到题目看数据范围之后就知道暴力显然是来不及的。那么只能找性质。\(考虑x和x+3的不同\quad奇偶性不同\)\(然后考虑两种操作对于一个数的奇偶性的影响\)\(加法:同奇偶则运算结果是偶,不同则运算结果为奇\)\(异或:惊奇的发现异或也是这样的\)这样我们就......
  • C# 对数值进行与,或,异或操作的学习理解
    //&符号是and,与,一个为0都是0,全部为1才是1//1&1=1,1&0=0,1与任何数都是任何数//0&1=0,0&0=0,0与任何数都是0varnum1=0b_1010_1010_1010;varnum2=0b_1111_0000;//保留num1二进制中4-7位Conso......
  • 异或运算的性质
    异或是一种基于二进制的位运算,用符号XOR或者^表示。性质1、交换律2、结合律:即(a^b)^c==a^(b^c))3、对于任何数x,都有x^x=0,x^0=x,x^1=x'。即一位数(假设是a),与自身异或,一定等于0; 与0异或-->等于本身;  与1异或---->等于a'。4、自反性A^B^B=A^0=A异或运算最常见于多项......
  • CF-1831-E-卡特兰数+异或哈希+差分
    1831-E题目大意给定一个整数\(n\),和\(k\)个区间,区间端点范围在\([1,n]\)内。如果有一个长为\(n\)合法的括号序列,且它的这\(k\)个区间\([l,r]\)中的子括号序列也是合法的,那么称这个括号序列是“好的”。请你求出有多少个长度为\(n\)的“好的”括号序列,答案对\(998244353\)取模......
  • 洛谷 P9745 「KDOI-06-S」树上异或 题解
    Solution树形DP好题。PartI部分分类比下文为简单,我们称一个连通块的权值为连通块内点的异或和。考虑链的部分分,显然可以设\(f_{i}\)是前\(i\)个点所有断边方案的权值和,对于每个点枚举上一条断的边转移。令\(s_i=\bigoplus_{j=1}^{i}a_j\),则\(f_i=\sum_{j=0}^{i-1}(s......
  • 最大异或和 可持久化数据结构入门
    最大异或和题目描述给定一个非负整数序列\(\{a\}\),初始长度为\(N\)。有\(M\)个操作,有以下两种操作类型:Ax:添加操作,表示在序列末尾添加一个数\(x\),序列的长度\(N\)加\(1\)。Qlrx:询问操作,你需要找到一个位置\(p\),满足\(l\lep\ler\),使得:\(a[p]\oplusa[p+1]......
  • 刷题 位运算异或 异或前缀和
    2024.1.18杭州电子科技大学2023华为杯编程竞赛 解题思路首先可以知道,我们任意选一点为根root往下递归异或就可以得到f[i](root到i的路径异或值),那么 l到r的路劲异或值可以由f[l]^f[r]得出那么如何计算答案呢,就是用f[l]~f[r]分别异或f[x]......
  • abc098d<双指针,异或>
    题目D-XorSum2给出n个元素的数组a,求满足条件的子区间个数:数组a子区间元素和与异或和相等。思路和与异或和相同,即没有任何进位,也就是区间中对于范围内每个二进制位,最多出现一次;使用双指针,统计每个二进制位最多出现一次的区间个数即可;总结异或:不进位加法;代码点击......
  • 异或交换两个数
    先来复习一下&,|,^,~这四个位运算符号吧!(与)&:0&0=01&0=00&1=01&1=1(或)|:0|0=01|0=10|1=11|1=1(异或)^:0^0=01^0=10^1=11^1=0(取反)~:~1=0~0=1分析:8的二进制是1000,7的二进制是01118^7=1000^0111=1111=1515^7=1111^0111=1000=8可以看到,一个数异或两次就是它......
  • ctf.show新手必刷_菜狗杯 杂项签到/损坏的压缩包/谜之栅栏/你会数数吗/你会异或吗
    杂项签到下完压缩包打开获得一张糊糊的图片丢进010editor看一下,既然是签到,会不会直接就藏在里面呢..ctrl+F搜下ctf,找到flag:(小提示:记得把查找的对象从HexBytes换成Text)损坏的压缩包打开压缩包,发现打不开,确实是损坏的压缩包。损坏的话可能是格式不太对,或者格式对了但是内......