按位异或解题技巧「建议收藏」

按位异或解题技巧「建议收藏」按位异或可以解决类似开灯问题一类的问题。首先了解下什么是按位异或:异或运算:首先异或表示当两个数的二进制表示,进行异或运算时,当前位的两个二进制表示不同则为1相同则为0.该方法被广泛推广用来统计一个数的1的位数!参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1。即:  0^0=0,  1^0=1,  0^1=1,  1^1=0按位异或的3个特点:…

大家好,又见面了,我是你们的朋友全栈君。

按位异或可以解决类似开灯问题一类的问题。
首先了解下什么是按位异或:
异或运算:

首先异或表示当两个数的二进制表示,进行异或运算时,当前位的两个二进制表示不同则为1相同则为0.该方法被广泛推广用来统计一个数的1的位数!

参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1。
即:
  0^0 = 0,
  1^0 = 1,
  0^1 = 1,
  1^1 = 0
按位异或的3个特点:
(1) 00=0,01=1 0异或任何数=任何数
(2) 10=1,11=0 1异或任何数-任何数取反
(3) 任何数异或自己=把自己置0
按位异或的几个常见用途:
(1) 使某些特定的位翻转
例如对数10100001的第2位和第3位翻转,则可以将该数与00000110进行按位异或运算。
      10100001^00000110 = 10100111

(2) 实现两个值的交换,而不必使用临时变量。
例如交换两个整数a=10100001,b=00000110的值,可通过下列语句实现:
    a = a^b;   //a=10100111
    b = b^a;   //b=10100001
    a = a^b;   //a=00000110

了解之后,我们就可以利用他的特点来解题。
举个例子,开灯问题:
在一条无限长的路上,有一排无限长的路灯,编号为1,2,3,4,…1,2,3,4,…。

每一盏灯只有两种可能的状态,开或者关。如果按一下某一盏灯的开关,那么这盏灯的状态将发生改变。如果原来是开,将变成关。如果原来是关,将变成开。

在刚开始的时候,所有的灯都是关的。小明每次可以进行如下的操作:

指定两个数,a,ta,t(aa为实数,tt为正整数)。将编号为[a],[2 \times a],[3 \times a],…,[t \times a][a],[2×a],[3×a],…,[t×a]的灯的开关各按一次。其中[k][k]表示实数kk的整数部分。

在小明进行了nn次操作后,小明突然发现,这个时候只有一盏灯是开的,小明很想知道这盏灯的编号,可是这盏灯离小明太远了,小明看不清编号是多少。

幸好,小明还记得之前的nn次操作。于是小明找到了你,你能帮他计算出这盏开着的灯的编号吗?

输入输出格式
输入格式:
第一行一个正整数nn,表示nn次操作。

接下来有nn行,每行两个数,a_i,t_ia
i
​ ,t
i
​ 。其中a_ia
i
​ 是实数,小数点后一定有66位,t_it
i
​ 是正整数。

输出格式:
仅一个正整数,那盏开着的灯的编号。

输入输出样例
输入样例#1: 复制
3
1.618034 13
2.618034 7
1.000000 21
输出样例#1: 复制
20
说明
记T=t_1+t_2+t_3+…+t_nT=t
1
​ +t
2
​ +t
3
​ +…+t
n
​ 。

对于30%30%的数据,满足T \le 1000T≤1000
对于80%80%的数据,满足T \le 200000T≤200000
对于100%100%的数据,满足T \le 2000000T≤2000000
对于100%100%的数据,满足n \le 5000,1 \le a_i<1000,1 \le t_i \le Tn≤5000,1≤a
i
​ <1000,1≤t
i
​ ≤T
数据保证,在经过nn次操作后,有且只有一盏灯是开的,不必判错。

思路:
第一想法,我觉得是开数组暴力模拟,但是当你了解了按位异或之后,你就会…大吃一惊。
AC代码:

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int main()
{ 
   
	ios::sync_with_stdio(false);
	int n , t , i ,j;
	int res = 0;
	double a;
	cin >> n;
	for(i = 0 ; i < n ; i++)
	{ 
   
		cin >> a >> t;
		for(j = 1 ; j <= t ; j++)
		{ 
   
			res^=int(j*a);
		}
	}
	cout << res << endl;
	return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/135802.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • centos搭建python环境_centos安装python

    centos搭建python环境_centos安装pythoncentos安装python环境查看系统自带版本查看系统自带版本位置下面介绍安装Python3的方法下载python包解压安装包创建软链接升级pip测试python3由于centos7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到。查看系统自带版本输入Python命令,查看可以得知是Python2.7.5版本查看系统自带版本位置whichpython一般是位于/usr/bin/python目录下。下面介绍安装Python3的方法

  • IDEA使用模板自动生成类注释和方法,解决方法注释在接口中或普通类的方法外使用模板注释不带参数的情况

    IDEA使用模板自动生成类注释和方法,解决方法注释在接口中或普通类的方法外使用模板注释不带参数的情况IDEA自动生成类注释和方法注释类注释方法注释类注释按照下方路径打开设置File->Settings->Editor->FileandCodeTemplates->Includes->FileHeaderFileHeader代码/***@author${USER}*@dateCreatedin${DATE}${TIME}*@modifiedBy${USER}in${DATE}${TIME

  • c 语言加壳项目,C 加壳工具,快速完成加密保护

    c 语言加壳项目,C 加壳工具,快速完成加密保护当前C#.net语言的应用范围越来越广泛,IIS的服务器架构后台代码、桌面应用程序的winform、Unity3d的逻辑脚本都在使用。C#.net具备强大的便捷特性,使得开发成本极低。而作为一款.net语言,也有它让开发者头疼的弊病——非常容易被反编译。市面上的Dnspy,ILspy,de4dot等工具可以非常容易反编译出被混淆保护的C#.net程序。01解决方案深思自主研…

  • 数据库置疑处理_sqlserver可疑数据库恢复

    数据库置疑处理_sqlserver可疑数据库恢复现象说明:新备份出的数据库Geb,在还原时报错”MicrosoftSQL-DMO(ODBCSQLState:42000)” 解决方法: 分离出还原失败的数据库Geb 先创建一个同样的数据库Geb 停掉server服务,用旧的数据文件覆盖新创建的文件(只要mdf就可以)。  启动server服务  运行以下命令  sp_configur

  • redis 乐观锁_什么时候用乐观锁

    redis 乐观锁_什么时候用乐观锁文章目录GeospatialHyperloglogBitmapsRedis事务悲观锁和乐观锁JedisSpringboot继承RedisGeospatial存储地理位置的数据结构应用场景朋友的定位,附近的人,打车距离计算Geospatial底层使用的是Zset127.0.0.1:6379> geoadd city 116.23 40.22 beijing 添加一个数据127.0.0.1:6379> geoadd city 121.47 31.23 shanghai 118.77

  • eruka快速刷新和kafka配置

    eruka快速刷新和kafka配置Kafkapartition扩充并且需要迁移数据生产不用指定具体分区,会自动分配拉取也不用指定具体分区,会自动拉多个分区可以同时拉取多个topickafka配置<dependency><groupId>org.apache.kafka</groupId><artifactId>kafka_2.12</artifactId><version>2.3.0</version>&lt…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号