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

【模拟题】异或 (二进制)

异或

问题描述

给定序列\(?\),计算\(\sum^{n}_{i=1}\sum^{n}_{j-i}A_i and A_{i+1} and .... and A_j\)

输入格式】

第一行一个整数\(?\).
第二行\(?\)个整数描述\(?\).

输出格式

一行输出答案\(ans\).

样例输入

3
1 2 3

样例输出

8

数据规模

对于\(10\%\)的数据,\(? ≤ 100, ?_i ≤ 1\).
对于\(20\%\)的数据,\(? ≤ 100\).
对于\(30\%\)的数据,\(? ≤ 1000\)
对于\(40\%\)的数据,\(? ≤ 100000\)
以上的数据档互不相交.
对于所有的数据,满足\(1 ≤ ? ≤ 10^5, 0 ≤ ?_i ≤ 2^{31 − 1}\).

题解

我们可以去利用二进制的\(\&\)的性质,去计算二进制每一位的\(1\)的贡献。

因为\(\&\)后有一位变成\(0\),那么它永远不会有贡献了(永远不会变成\(1\)),然后去计算会有多少个数会有这个\(1\)(权值为\(1<<i\))的贡献。

注意,一定要用\(1LL\),否则\(2^{32}\)会炸。

code(&):

#include<iostream>
#include<cstdio>
#include<cctype>
#define N 100005
#define ll long long 
#define R register
using namespace std;
template<typename T>inline void read(T &a){
    char c=getchar();T x=0,f=1;
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    a=f*x;
}
int n,a[N],cnt;
ll ans;
int main(){
    read(n);
    for(R int i=1;i<=n;i++)read(a[i]);
    for(R ll i=0;i<=32;i++){
        cnt=0;
        for(R int j=1;j<=n;j++){
            if(a[j]&(1LL<<i))cnt++;
            else cnt=0;
            ans+=cnt*(1LL<<i);
        }
    }
    printf("%lld\n",ans);
    return 0;
}

拓展

后来大佬GMPotlc又告诉了我一个处理异或(^)的做法。

都是利用二进制中的性质,异或偶数次无贡献,异或奇数次才有贡献。

而且若现在\(1\)的个数为奇数,那么就会与前面偶数次的产生贡献;当前为偶数,则反之。

所以我们记录一个出现\(1\)奇数次的个数\(a\)和偶数次的个数\(b\),总个数\(cnt\)

\(cnt\)为奇数 \(ans+=(b*(1LL<<i)),a++;\)

\(cnt\)为偶数 \(ans+=(a*(1LL<<i)),b++;\)

注意:初始化 ,\(b=1\)(因为一开始\(0\)\(1\)也是偶数)。

code(^):

#include<iostream>
#include<cstdio>
#include<cctype>
#define N 100005
#define ll long long 
#define R register
using namespace std;
template<typename T>inline void read(T &a){
    char c=getchar();T x=0,f=1;
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    a=f*x;
}
int n,init[N],cnt,a,b;
ll ans;
int main(){
    read(n);
    for(R int i=1;i<=n;i++)read(init[i]);
    for(R ll i=0;i<=32;i++){
        cnt=0;a=0;b=1;
        for(R int j=1;j<=n;j++){
            if(init[j]&(1LL<<i))cnt++;
            if(cnt&1)ans+=(1LL<<i)*b,a++;
            else ans+=(1LL<<i)*a,b++;
        }
    } 
    printf("%lld\n",ans);
    return 0;
}

转载于:https://www.cnblogs.com/ZAGER/p/9858846.html

相关文章:

  • Xposed Hook Anti-hook
  • Failed to load property source from location 'classpath:/application.properties'
  • embed-it_Integrator memory compile工具使用之三
  • Python3.x 常用的新特性
  • Android版本依赖解析
  • 认识requests库,以及安装方法
  • Intellij IDEA 修改jsp 不能实时更新
  • bzoj3884: 上帝与集合的正确用法
  • JS语法回顾
  • AVL树和平衡二叉树 平衡因子 右旋转LL 左旋转RR LR RL
  • 【NOIP模拟】机器人
  • oracle创建Javasource实现数据库备份
  • qqluxc
  • IronPython初体验
  • Leetcode657.Robot Return to Origin机器人能否返回原点
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 5、React组件事件详解
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • DOM的那些事
  • MySQL QA
  • Nodejs和JavaWeb协助开发
  • Object.assign方法不能实现深复制
  • Octave 入门
  • springboot_database项目介绍
  • vue.js框架原理浅析
  • 彻底搞懂浏览器Event-loop
  • 番外篇1:在Windows环境下安装JDK
  • 听说你叫Java(二)–Servlet请求
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 用jQuery怎么做到前后端分离
  • 如何用纯 CSS 创作一个货车 loader
  • ​业务双活的数据切换思路设计(下)
  • #HarmonyOS:基础语法
  • #pragma multi_compile #pragma shader_feature
  • $forceUpdate()函数
  • %check_box% in rails :coditions={:has_many , :through}
  • (C#)一个最简单的链表类
  • (C)一些题4
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (C语言)球球大作战
  • (Note)C++中的继承方式
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (分布式缓存)Redis持久化
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • .net framework profiles /.net framework 配置
  • .Net面试题4
  • @JsonSerialize注解的使用
  • @selector(..)警告提示
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务