逻辑异或
00=0
01=1
10=1
11=0
两个值异或(相同为假,不同为真)
两个二进制数异或的结果
即按位相减取绝对值再按位相加
二进制数a与b异或,即a和b两个数按位进行,如果对应位相同,即为0(这个时候相当于对应位算术相减),如果不相同,即为1(这个时候相当于对应位算术相减的绝对值)。由于二进制每个位只有两种状态,要么是0,要么是1,则按位异或操作可以表达为按位相减取绝对值,再按位累加。
题目及示例
分析
题目限制是,所以把每个数转变成20位二进制,高位用0补齐
只要求出公共序列中所有的二进制中有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