异或数列(python)

逻辑异或

0\forall0=0

0\forall1=1

1\forall0=1

1\forall1=0

两个值异或(相同为假,不同为真)

两个二进制数异或的结果

a\forall b=|a-b|

即按位相减取绝对值再按位相加

二进制数a与b异或,即a和b两个数按位进行,如果对应位相同,即为0(这个时候相当于对应位算术相减),如果不相同,即为1(这个时候相当于对应位算术相减的绝对值)。由于二进制每个位只有两种状态,要么是0,要么是1,则按位异或操作可以表达为按位相减取绝对值,再按位累加。

题目及示例

异或数列 - 蓝桥云课 (lanqiao.cn)

分析

题目限制是2^2^0,所以把每个数转变成20位二进制,高位用0补齐

只要求出公共序列中所有Xi的二进制中有1的和,和为偶数,则结果是平(初始都是零,遇1则翻)。和为奇数则会有一方胜出

考虑和为奇数的情况,此时需要分析0的奇偶性

0为偶,先手赢

0为奇,先手必输

特判:1的数目为1时,不论先后手必赢

代码

import os
import sys

# 请在此输入您的代码
# 异或数列
def get_bits(num):  
  n=0
  while(num>=1):
    bit=num & 1
    bits[n]+=bit
    num >>=1
    n+=1

N=int(input())
for i in range(N):
  tmp=[int(i) for i in input().split()]
  n=tmp[0]
  nums=tmp[1:]
  bits=[0 for i in range(20)]
  flag=0
  for num in nums:
    get_bits(num)
    flag ^=num
  if (flag==0):
    print(0)
    continue
  else:
    for i in range(20):
      if (bits[19-i]==1):
        print(1)
        break
      if (bits[19-i]%2==1 and (n-bits[19-i])%2==0):
        print(1)
        break
      if (bits[19-i]%2==1 and (n-bits[19-i])%2==1):
        print(-1)
        break

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值