基础算法题——异或和之和(位运算、组合数)

2023-11-01

异或和之和

题目链接
题目1
题目2


解题思路

解题方案
暴力枚举:时间复杂度:O(n3),超时。

位操作+组合数:解铃还须系铃人。对于这种与、或、异或的位操作,一般也是通过位操作来解答。


总结规律
题目要求在 n 个正整数中枚举 3 个数进行位操作,若要确定 3 个数的异或结果,就要寻找对异或结果的位有影响的情况。
枚举可能情况:
0 ^ 0 ^ 0 = 0
0 ^ 0 ^ 1 = 1
0 ^ 1 ^ 0 = 1
0 ^ 1 ^ 1 = 0
1 ^ 0 ^ 0 = 1
1 ^ 0 ^ 1 = 0
1 ^ 1 ^ 0 = 0
1 ^ 1 ^ 1 = 1
①、当 3 个都为 1 时,异或的结果为 1 。
②、当 2 个为 0 时,异或结果为 1 。
③、除了 ①、② 外,其余情况为 0 。


代码解析
①、枚举每一位二进制数的值,先对 mod 求余防止溢出。
eg:1(1), 2(10), 4(100), 8(1000)…

f[0]=1;
for(int i=1; i<64; i++)
	f[i] = (f[i-1]<<1)%mod;

②、统计 n 个整数的每一位 1 的个数及 0 的个数。
0 的个数 = n - 1 的个数。可以不必再求。

//统计 n 个整数每一位为 1 的数量
//eg:num[j]: n 个整数第 j 位为 1 的数量
for(int i=0; i<n; i++){
	ll tmp;
	scanf("%lld", &tmp);
	for(int j=0; j<64; j++)
		num_1[j] += (tmp>>j)&1;
}

③、计算出每一位异或和结果能够得到多少个 1 ( k ) ,最后将答案与该位大小 * 1 的个数( f [ i ] * k ) 累加起来,并求余。

for(int i=0; i<64; i++){
	ll one=num_1[i], zero=n-num_1[i], k; 
	//1 0 0 | 0 1 0 | 0 0 1
	if(zero>=2 && one>=1){ 
     	k = zero*(zero-1)*one/2%mod;
    	ans = (ans+k*f[i]%mod)%mod;
    }
    //1 1 1
    if(one>=3){
       	k = one*(one-1)*(one-2)/6%mod;
	   	ans = (ans+k*f[i]%mod)%mod;
    }
}

注意优先级 :
‘*’、’/’ > ‘%’ > ‘+’、’-’ > ‘<<’、’>>’ > ‘=’


实现代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll ans=0;
int f[64]={0}, num_1[64]={0};
const int mod = 1e9+7;

int main(){
	int n;
	scanf("%d", &n);
	
	f[0]=1;
	for(int i=1; i<64; i++)
		f[i] = (f[i-1]<<1)%mod;
	//<<优先级小于 mod
	
	for(int i=0; i<n; i++){
		ll tmp;
		scanf("%lld", &tmp);
		for(int j=0; j<64; j++)
			num_1[j] += (tmp>>j)&1;
	}
	
	for(int i=0; i<64; i++){
		ll one=num_1[i], zero=n-num_1[i], k; 
		//0 0 1
		if(zero>=2 && one>=1){ 
            k = zero*(zero-1)*one/2%mod;
            ans = (ans+k*f[i]%mod)%mod;
        }
        //1 1 1
        if(one>=3){
            k = one*(one-1)*(one-2)/6%mod;
            ans = (ans+k*f[i]%mod)%mod;
        }
	}
	//优先级 : 
	//'*'、'/' > '+'、'-' > '%' > '<<'、'>>' > '=' 
	printf("%lld", ans);
	
	return 0;
} 

总结

位操作对于异或、与、或等位运算是十分有效的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基础算法题——异或和之和(位运算、组合数) 的相关文章

  • 为什么更新外键后引用约束会不一致?

    抱歉 这个模糊的标题很难用一句话来描述 我有 2 个实体User and UserAddress 其中 User 有 2 个外键DefaultInvoiceAddressId and DefaultDeliveryAddressId和 Us
  • 根据当前文化调用不同(本地化)视图

    我在用着LocalizationAttribute它实现了ActionFilterAttribute本地化视图 我简单地说 Localize 在控制器上 我使用 LocalizeStrings resx 文件根据当前线程上的语言进行应用 一
  • 获取当前用户的 NetworkCredential (C#)

    我正在尝试从控制台应用程序调用 Web 服务 并且我需要向客户端提供System Net NetworkCredential object 是否有可能创建一个NetworkCredential启动应用程序的用户的对象而不提示输入用户名 密码
  • 如何从 std::vector 中删除元素而不调整其大小

    迭代器擦除 迭代器位置 迭代器擦除 首先是迭代器 迭代器最后 擦除元素 从向量中删除 容器可以是单个元素 位置 或一系列元素 第一个 最后一个 这有效地减少了向量 大小除以元素数量 删除 调用每个元素的 之前的析构函数 and remove
  • 错误 C2065:'cout':未声明的标识符

    我正在处理我的编程作业的 驱动程序 部分 但我不断收到这个荒谬的错误 错误 C2065 cout 未声明的标识符 我什至尝试过使用std cout但我收到另一个错误 IntelliSense 命名空间 std 没有成员 cout 当我宣布u
  • 如何在 C++ 中从模板基类的构造函数调用模板超类的构造函数?

    我正在使用 sublimetext3 用 c 进行编程 我的程序有一个名为 Array 的超类和一个名为 IntArray 的子类 这两个类都是模板类 目前 我在编译该程序时遇到问题 它不断在我的 IntArray cpp 文件中给出错误
  • 如果 .txt 文件不存在,则创建一个,如果存在则追加新行

    我想创建一个 txt 文件并写入它 如果该文件已经存在 我只想添加更多行 string path E AppServ Example txt if File Exists path File Create path TextWriter t
  • Linux C++ 调试器

    我正在寻找完美的 Linux C 调试器 我不期望成功 但搜索应该提供丰富的信息 我是一个非常有能力的 gdb 用户 但 STL 和 Boost 很容易压垮我的调试技能 并不是说我无法深入了解数据结构的内部结构 而是它需要很长时间 我通常会
  • 第三方引用的 dll 未被复制来构建

    我有一个第三方 net dll 被我的 dll 类库项目 A 引用和使用 我的控制台应用程序项目 B 引用项目 A 我的问题是第三方 dll 没有被复制到控制台应用程序项目 B 的构建中 这里有什么问题呢 我的 dll 类库中引用的第三方
  • 如何“全局”捕获对象实例中引发的异常

    我目前正在编写一个 winforms 应用程序 C 我正在使用企业库异常处理块 遵循我所看到的相当标准的方法 IE 在 Program cs 的 Main 方法中 我已将事件处理程序连接到 Application ThreadExcepti
  • OpenMP 循环数组访问中的错误共享

    我想利用 OpenMP 来并行执行我的任务 我需要将数组的所有元素减去相同的数量并将结果写入另一个向量中 两个数组都是动态分配的malloc第一个填充了文件中的值 每个元素都有类型uint64 t pragma omp parallel f
  • 如何在 C++ 中初始化嵌套类的构造函数

    我在初始化嵌套类构造函数时遇到问题 这是我的代码 include
  • 如何在Windows Azure上调用ffmpeg.exe转换音频文件?

    我在 Windows Azure 上运行 Web 角色来接收 AAC 音频文件 通过 base64 字符串上传 并将它们存储到 blob 中 现在效果很好 接下来 我还必须将它们转换为 MP3 并将 MP3 存储到 blob 中 我决定使用
  • 为什么 ASP.Net MVC Range 属性采用类型?

    我只是想知道为什么范围验证属性可以采用类型和两个字符串作为参数 这是为了根据枚举或类似的东西验证字符串吗 另外 我想做的是找到一种简单的方法来验证必须出现在枚举中的 3 个字符的字符串 有什么建议吗 谢谢 亚历克斯 我确实发现你提到的 Ra
  • 没有类型的 IEnumerable 属性

    我正在尝试创建一个类似于来自 MSDN 的官方 DataGrid ItemsSource 的属性 public IEnumerable ItemsSource get set 这提供了对任何派生类中任何类型的支持 有了这个 我可以设置类似的
  • 如何进行平衡组捕获?

    假设我有这个文本输入 tes tR R abc aD mnoR xyz 我想提取 ff 输出 R abc R xyz D mnoR xyz R R abc aD mnoR xyz 目前 我只能使用平衡组方法提取组内的内容 如中所示msdn
  • 是否可以在 Eclipse 中为除 Java 之外的 Eclipse 编写插件?

    谁能帮我用c 写一个eclipse插件 weekens 和 celavek 感谢您提供的信息 我正在研究 JNI 并将尝试实现它 celavek 我们必须做什么样的主控 控制 在C 和java接口中处理是否风险更大 我的要求是在 Java
  • 使用反射检测属性的访问修饰符类型

    我编写了一些代码来使用反射查看属性 我已经使用反射从类中检索了属性列表 但是我需要查明该财产是公共的还是受保护的 例如 public string Name get set protected int Age get set Propert
  • 如何以一对一/零关系更新员工和身份用户

    我正在尝试更新员工记录 也想更新身份用户 如果我先单独更新身份用户 例如 UserManager Update user Context Entry employee State System Data Entity EntityState
  • RC4 实现与 openssl 输出不匹配

    我的目标是在 C C 中实现 RC4 流密码 并确保它产生与使用时相同的输出openssl命令 按照伪代码维基百科 https en wikipedia org wiki RC4 该实现似乎有效 因为它可以加密和解密内容 但是 加密的输出与

随机推荐

  • vue中使用vconsole

    Vue中使用vconsole npm install vconsole 新建 vconsole js 文件 在文件中写入 import Vconsole from vconsole const vConsole new Vconsole e
  • ToList()所带来的性能影响

    原文 ToList 所带来的性能影响 前几天优化师弟写的代码 有一个地方给我留下很深刻的印象 就是我发现他总是将PLINQ的结果ToList lt gt 然后再返回给主程序 对于这一点我十分不解 于是去问他是什么原因 得到的答案很幽默 因为
  • sequence_item、sequence、sequencer、driver的关系

    框图 简单描述 driver sequencer sequence sequence item 细节理解 最初的验证平台只需要driver即可为什么还需要sequence机制 sequence机制的内部协议 sequence还有很多细节需要
  • 虚拟远程桌面

    微型服务器 太难理解了 我会为你简化它 考虑一个供应商部署的服务器机器来托管其众多客户的网站 为了在这台机器上设计 VPS 提供商会将其划分为多个分区并在虚拟级别上隔离它们 虚拟服务器 如果考虑性能 VPS 显然不如其父服务器 但是 就功能
  • LCD段码显示屏常见故障问题总结

    1 液晶屏有内污 一般现象为黑点 污点 纤维 指LCD内有纤维 2 液晶屏有内刮 一般现象为黑线 白线 PI被刮伤表现为线条刮伤 3 液晶显示颜色不均 一般现象为色彩不一致 彩虹 即LCD的色彩不均匀 在中间彩虹或杠边彩虹以及彩色条纹不均
  • C++之继承

    1 类与类之间的关系有哪些 与类之间的关系分为纵向和横向两种 纵向就是继承 横向包括 依赖 关联 聚合和组合 这里不进行解释 详解链接 https blog csdn net u014694510 article details 88316
  • 关于卷积和其偏置的详细动态图

    动态图 每走一步 得到的图片的值为a b c bias 其中a为卷积核在第一个信道上卷积的值 b为卷积和在第二个信道上卷积的值 c为卷积核在第三个信道上卷积的值 将他们加起来再加上偏置 而在TensorFlow中为什么用conv1 bias
  • Vue基础

    前期回顾 字符串 vue可能会用到的内容 indexOf lastIndexOf 查询字符串下标 找不到返回 1 split 分割为数组 slice start end 切割字符串 subString start end 截取字符串 按下标
  • 360移动安全岗位实习生笔试和面试之旅

    之前抱着试一试的心态投了360的安全岗位 个人觉得移动安全在未来会有很大的需求量 并且人才比较少 安全圈子本来就很小 安全技术本来价值就很高 所以很多大公司以及真正的黑客很少分享一些安全方面的技术 这些感受是我作为一个脚本小子半年来的感触
  • 为什么http请求会缓存?显示from disk cache?

    请求一个接口 发现status code 200 但是居然是否 from disk cache 接口也会缓存吗 请问是什么原因 问题描述 请求接口 发现拿的还是旧数据 排查了一天 后面和前端发现请求接口只花了1ms 然后发现接口状态为 20
  • Dynamics CRM 2016 常用基础操作

    来源 https blog csdn net jxian2009 article details 22179447 http www cnblogs com allenhua archive 2012 12 25 2832473 html
  • Unity 通过代码为一个物体添加多个材质球materials

    Unity 通过代码为一个物体添加多个材质球materials Unity的MeshRenderer提供了Materials数组 支持同时挂多种材质 这样做的目的是 为含有Mesh对象的多个SubMesh使用不同的材质 渲染不同的效果 需要
  • 【acadres.dll文件丢失怎么办】acadres.dll文件丢失的解决办法

    acadres dll文件丢失怎么办 acadres dll是一个windows系统中必备的dll文件 该类型文件的全称为Dynamic Link Library 意思就是动态链接库 不过各位小伙伴不必在意 我们只需要知道它是一个电脑中非常
  • python三维曲面图投影_matplotlib:在2dp上投影三维曲面

    有与 Axes3 相当的吗DSubplot plot 表面 在2D里 我试图在matplotlib中绘制网格在XY平面上的投影 因此不是在 3d 模式下 在import numpy as np import matplotlib pyplo
  • 计算机考研专业课考c语言的大学,【择校必看】十三所计算机专业课只考数据结构的985院校!...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 敲黑板 本文涉及到的学校计算机专业考研只考数据结构 其中部分院校同时也会考算法 C语言等相关内容 但是 相对其他几门 无疑在专业课的复习上大大降低了难度 如果各位同学目前的专业课复习并不理想 也
  • 微信小程序-解决scroll-view抖动

    微信小程序scroll view抖动 原因 产品需要点击换一换 列表置顶并刷新 所以需要动态绑定scroll view里面的scrollTop属性 scrollTop属性用法需要保存 scroll时的值 如果在 scroll时直接复制给sc
  • 01内存对齐之结构体偏移量

    01内存对齐之结构体偏移量 前提概念 结构体偏移量 所谓偏移量 就是我们每个结构体成员的首地址而已 1 求结构体成员偏移量的两中办法 1 简单求结构体成员偏移量 注意 求偏移量时 必须将地址转成int整数才能求偏移量 不能直接地址相减 否则
  • Easyexcel导出带下拉框选项excel模板(解决下拉框超50个的问题)

    1 为了避免excel下拉框选项过多会导致内容不显示 或者生成的时候报错 String literals in formulas can t be bigger than 255 characters ASCII easyexcel 将下拉
  • MobaXterm下载提示输入Master密码,如何使用ResetMasterPassword工具恢复MobaXterm和设置MobaXterm主密码

    MobaXterm忘记主密码 如何恢复和设置主密码 点此下载ResetMasterPassword MobaXterm 20 0汉化版下载 MobaXterm是一款非常好用的远程管理软件 支持SSH FTP 串口 VNC X server等
  • 基础算法题——异或和之和(位运算、组合数)

    异或和之和 题目链接 解题思路 解题方案 暴力枚举 时间复杂度 O n3 超时 位操作 组合数 解铃还须系铃人 对于这种与 或 异或的位操作 一般也是通过位操作来解答 总结规律 题目要求在 n 个正整数中枚举 3 个数进行位操作 若要确定