异或数列/位运算/数位/二进制

这篇具有很好参考价值的文章主要介绍了异或数列/位运算/数位/二进制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

异或数列/位运算/数位/二进制

异或数列/位运算/数位/二进制 

题解:

 知识点很多,依次总结:

位运算:

1.左移/右移

针对二进制数位来说的

i<<=1#左移一位,向更高位
i>>=1#右移一位,向更低位

2.或操作|   与操作&   异或操作^

异或操作满足结合律、交换律和1^x=~x(即x翻转)    0^x=x的规律

3.求数的最高数位:

length=1
while length<=val:
    length<<=1

求得的length为0b100000...其中0的个数等于val化为二进制后的数位值,例如bin(15)=0b1111,为4位,那么length=0b10000

这有什么意义呢?

已知val和其对应的length,和另一个数字num
length可用来判断num在数位length上的数字是0还是1!!
if num&length==0:
    为0
else:
    为1

然后进行本题的分析:

首先明确一点:对于X1,X2,X3来说,Alice先选择X1,Bob还可以继续选择X1!!为什么说只能选择一次呢?那是针对一个人来说的,即Alice选择了一次X1,不能再选了,当任意一个人选完了X数组的所有值,游戏结束

异或数列/位运算/数位/二进制

 1.平局的情况:a^b=0即a^b^X1^X2^X3.....^Xn=0,根据交换率和结合律以及异或的定义,这些数都相等,故X1^X2^...=0

2.X1^X2^...!=0时,因为最优策略,A赢的意思是:A能采取某种策略,不管B作何应对,A保证自己一定能赢;B赢的意思是:B能采取某种策略,不管A作何应对,B保证自己一定能赢,所以:

A赢的意思是:A能采取某种策略,不管B作何应对,A保证自己一定能赢;
B赢的意思是:B能采取某种策略,不管A作何应对,B保证自己一定能赢;
对于异或:0^X ——保持X ; 1^X——翻转X;
偶数次翻转将回到原来的状态,即与偶数个1异或将保持不变。

最后两个结果数A^B = a^b^sum ,其中sum为给定数列所有数的异或和,sum = X1^X2^...Xni,所以如果是平局(即A = B),则A^B=0(即 sum = 0)。

现在考虑sum != 0时,因为是按位异或,并且最后比较A和B两值的大小,所以要从二进制的最高位开始比较,如果最高位相等,比较次高位,以此往下比较,直到可以判断出结果。

用一个int型数组res[i]表示二进制的第i位上1的个数,如果某一位的res[i]为奇数,即该位上有奇数个1与a和b异或,比如有5个1,因为0不会改变状态,其(a,b)的状态转移过程一定是:(0,0)->翻转->平局->翻转->平局->翻转,也就是说在平局不管是(0,0)或(1,1)的基础上,Alice 和 Bob谁拥有最后一次翻转权(也就是最后一个1),谁就赢得游戏!

那怎么让最后一个1轮到自己身上?就要用到0了,因为0不会改变数的大小,但相当于让自己“轮空一次”。还是考虑上面5个1的情况:如果在最后一次翻转之前(不管在什么位置)插入偶数个0,则最后一次1的翻转权来到了先手 Alice,则先手胜出;如果在最后一次翻转之前(不管在什么位置)插入奇数个0,则最后一次1的翻转权来到了后手 Bob,则后手胜出。

因为Alice和Bob都“足够聪明”,面对奇数个1,Bob一定要去“ 抢0 ”,自己才有一线生机,而Alice也要以“ 抢0 ”来作应对,让最后一次翻转权回到自己手里,因为0的个数有限,最后决定胜负的就是0个数的奇偶性。

因此,如果某一位的res[i]为偶数,则游戏结果的这一位一定相等,考虑下一位 ;如果第i位上1的个数为 1,则一定是先手赢(输出:“1”);如果第i位上1的个数为大于1的奇数,0的个数为偶数,则先手赢(输出:“1”);如果第i位上1的个数为大于1的奇数,0的个数为奇数,则后手赢(输出:“-1”)。

 给出代码:文章来源地址https://www.toymoban.com/news/detail-403289.html

import os
import sys

# 请在此输入您的代码
T=int(input())
for i in range(T):
  nums=list(map(int,input().split()))
  li=nums[1:]
  sumd=0
  maxNum=0
  for i in li:
    sumd^=i 
    maxNum=max(maxNum,i)
  if sumd==0:
    print(0)
    continue
  length=1
  while length<=maxNum:
    length<<=1
  while length>0:
    zeros,ones=0,0
    for i in li:
      if i&length==0:
        zeros+=1
      else:
        ones+=1
    if ones%2!=0:
      if onse==1:
        print(1)
      elif zeros%2==0:
        print(1)
      else:
        print(-1)
      break
    length>>=1

到了这里,关于异或数列/位运算/数位/二进制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【位运算】二进制状态压缩、成对变换、lowbit运算

    二进制状态压缩,是指将一个长度为 m m m 的 bool 数组用一个 m m m 位二进制整数表示并存储的方法。 利用下列位运算操作可以实现原 bool 数组中对应下标元素的存取。 操作 运算 取出整数 n n n 在二进制表示下的第 k k k 位 (n k) 1 取出整数 n n n 在二进制表示下的第 0 0 0 ~ k −

    2024年02月08日
    浏览(30)
  • 【第36天】组合位运算训练 | 二进制思想

    本文已收录于专栏 🌸《Java入门一百例》🌸

    2024年02月01日
    浏览(28)
  • 深入解析位运算算法:探索数字的二进制秘密

    位运算是计算机科学中的重要概念,用于在二进制数字层面进行各种操作。本文将深入介绍位运算的基本操作,以及它在判断、计算和处理数字中的应用,包括判断2的幂次方、位图法、位掩码和寻找缺失数字等。 位操作是通过对数字的二进制表示进行操作,实现各种功能。

    2024年02月11日
    浏览(34)
  • ( 位运算 ) 190. 颠倒二进制位 ——【Leetcode每日一题】

    难度:简单 颠倒给定的 32 位无符号整数的二进制位。 提示: 请注意,在某些语言(如 Java )中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是

    2024年02月03日
    浏览(28)
  • 【FPGA】Verilog:二进制并行加法器 | 超前进位 | 实现 4 位二进制并行加法器和减法器 | MSI/LSI 运算电路

    0x00 并行加法器和减法器 如果我们要对 4 位加法器和减法器进行关于二进制并行运算功能,可以通过将加法器和减法器以 N 个并行连接的方式,创建一个执行 N 位加法和减法运算的电路。 4 位二进制并行加法器 4 位二进制并行减法器

    2024年02月05日
    浏览(42)
  • 码出高效_第一章 | 有意思的二进制表示及运算

    设想有8条电路,每条电路有高电平和低电平两种状态,即就有2 8 =256种不同的信号。假设其表示区间为0~255,最大数即2 8 -1。 那么32条电路能够表示最大数为(2 32 -1)=4294967295,即所谓的32位电路信号。 正负数表示: 上面的8条电路,最左侧一条表示正负:0-整数,1-负数,不

    2024年02月06日
    浏览(25)
  • 关于二进制的原码、补码和反码,以及表示范围、常见位运算符和进制转换的理解与简述

    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/17963363 出自【进步*于辰的博客】 参考笔记一,P3.13、P5.1;笔记三,P43.1/3、P44.1。 注:我暂且没有整理关于二进制、原码、补码和反码等概念的理论,本文中的阐述都基于

    2024年02月02日
    浏览(37)
  • (位运算) 1356. 根据数字二进制下 1 的数目排序 ——【Leetcode每日一题】

    难度:简单 给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。 如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。 请你返回排序后的数组。 示例 1: 输入 :arr = [0,1,2,3,4,5,6,7,8] 输出 :[0,1,2,4,8,3,5,6,7] 解释

    2024年02月12日
    浏览(30)
  • 剑指 Offer 15. 二进制中1的个数 / LeetCode 191. 位1的个数(位运算)

    链接:剑指 Offer 15. 二进制中1的个数;LeetCode 191. 位1的个数 难度:简单 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型。

    2024年02月12日
    浏览(25)
  • 【十进制 转 二进制】【二进制 转 十进制】10进制 VS 2进制【清华大学考研机试题】

    原题链接 本题我们先需要知道 十进制 如何转 二进制 二进制 如何转 十进制 十进制 如何转 二进制: 十进制转成二进制 例如 173 转成 二进制 就把173 短除法 除到0 然后 得到的余数, 从下往上写 二进制 转成 十进制 利用如图方法,把二进制 转成 十进制 本题是高精度,如何

    2023年04月26日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包